搜索 || DFS || POJ 1321 棋盘问题

棋盘上#可以放,.不可以放,每行每列只能放一个
*解法:类似八皇后问题 dfs+回溯,考虑每一行和每一列
【【【【dfs的样子】】】】最前面写达到目标状态or不能走下去了 然后return
#include <iostream>
#include <cstdio>
using namespace std;
int n, k;
char a[11][11];
int vis[10];
int ans;
void dfs(int u, int cnt)
{
    if(cnt == k) {ans++; return;}
    if(u >= n) return;
    //在第u行放棋子
    for(int i = 0; i < n; i++)
    {
        if(!vis[i] && a[u][i] == '#')//放在第i列
        {
            cnt++;
            vis[i] = 1;
            dfs(u + 1, cnt);
            cnt--;//不放在第i列
            vis[i] = 0;
        }
    }
    //在第u行不放棋子
    dfs(u + 1, cnt);
}
int main()
{
    while(1)
    {
        scanf("%d %d", &n, &k);
        if(n == -1 && k == -1) break;
        for(int i = 0; i < n; i++)
            scanf(" %s", a[i]);
        ans = 0;
        memset(vis, 0, sizeof(vis));
        dfs(0, 0);
        printf("%d
", ans);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/pinkglightning/p/8407182.html