中文题, 题目不再解释, 简单dfs;
 
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <cctype>

bool maps[10][10];//maps做棋盘,判断此点能不能下棋 maps[0][i]用来记录第i列能不能下棋
int n, k, ans, hang;//hang代表此刻在第几行下棋

void DFS(int k)
{
    if(k == 0) {//棋子放完
        ans++;
        return;
    }
    if(hang > n)//已检查行数大于等于n,此时k还未等于0;
        return;
    if(n - hang + 1 < k)//剩下行数不够棋子数
        return;
    hang++;
    for(int j = 1; j <= n; j++) {
        if(maps[0][j]) continue;
        if(!maps[hang][j]) continue;
        maps[0][j] = true;
        DFS(k - 1);
        maps[0][j] = false;
    }
    //如果此行没有棋子可放, 检查下一行
    DFS(k);
    hang--;
}

int main()
{
    char ch;
    while(~scanf("%d %d", &n, &k), n != -1 || k != -1) {
        memset(maps, false, sizeof(maps));
        ans = 0;
        for(int i = 1; i <= n; i++) {
            scanf(" ");
            for(int j = 1; j <= n; j++) {
                scanf("%c", &ch);
                if(ch == '#') maps[i][j] = true;
            }
        }
        
        hang = 1;
        for(int j = 1; j <= n; j++) {
            if(maps[0][j]) continue;
            if(!maps[hang][j]) continue;
            maps[0][j] = true;
            DFS(k - 1);
            maps[0][j] = false;//回溯
        }
        DFS(k);
        printf("%d\n", ans);
    }
}
posted on 2015-07-20 17:37  毕竟我是王宇浩  阅读(142)  评论(1编辑  收藏  举报