棋盘上#可以放,.不可以放,每行每列只能放一个
*解法:类似八皇后问题 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; }