棋盘问题 POJ - 1321 (DFS)

最简单的DFS问题,以后一定要做到闭着眼睛都能够打出来。设定搜索状态为放置第cur个棋子在x,y处,目标状态为cur = k,没放置一个棋子到x,y处,下个棋子的位置就从x+1,y开始搜索

//棋盘问题
#include<cstdio>
#include<cstring>
using namespace std;

bool chess[10][10], visited[10];
int n, k;
long long ans;
void Dfs(int cur, int x, int y)
{   //放置第cur个棋子在x,y处,目标状态为cur = k
    if(cur == k){
        ans++;
        return;
    }
    for(int i = x+1; i <= n; i++)
        for(int j = 1; j <= n; j++){
            if(chess[i][j] && !visited[j]){
                visited[j] = true;
                Dfs(cur+1, i, j);
                visited[j] = false;
            }
        }
}
int main()
{
    scanf("%d%d",&n,&k);
    while(n!=-1 || k!=-1){
        char input; ans = 0;
        memset(chess, 0, sizeof(chess)), memset(visited, 0, sizeof(visited));
        for(int i = 1; i <= n; i++){
            getchar();
            for(int j = 1; j <= n; j++){
                scanf("%c",&input);
                if(input == '.') chess[i][j] = false;
                else if(input == '#') chess[i][j] = true;
            }
        }
        //算法
        Dfs(0, 0, 0);
        printf("%lld\n",ans);
        scanf("%d%d",&n,&k);
    }
}

 

展开阅读全文

没有更多推荐了,返回首页