A--棋盘问题
POJ-1321
链接: https://vjudge.net/problem/15202/origin
类似n皇后问题,需要注意的是dfs的边界问题(t在此处
思路:当前走到i/u行j列,判断该点是否可以放棋子,不可以就j++,可以就dfs(i + 1),对放的棋子数进行计数,若等于k则return,记得状态还原。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 5 using namespace std; 6 const int N = 20; 7 8 int n, k, flag; 9 char g[N][N]; 10 bool row[N]; 11 12 void dfs(int u, int x){ 13 if(x == k) { 14 flag ++; 15 return; 16 } 17 18 for(int i = u; i < n ; i ++ ){ 19 for(int j = 0; j < n; j ++ ){ 20 if(g[i][j] != ‘.‘ && !row[j]){ 21 row[j] = true; 22 dfs(i + 1, x + 1); 23 row[j] = false; 24 } 25 } 26 } 27 return; 28 } 29 30 int main() 31 { 32 while(scanf("%d %d", &n, &k) != EOF){ 33 if(n ==-1 && k == -1) break; 34 flag = 0; 35 for(int y = 0; y < n; y ++ ) 36 for(int z = 0; z < n; z ++ ) 37 cin>>g[y][z]; 38 dfs(0, 0); 39 printf("%d\n",flag); 40 } 41 return 0; 42 }
原文:https://www.cnblogs.com/moomight/p/11317770.html