题目链接:https://cn.vjudge.net/problem/POJ-1321
和八皇后问题不同:当k < n 时,某些行可以不必填
思路:从当前行i的'#'开始搜,标记纵坐标,从i+1行到n-1行搜下一个‘#’(默认从第0行开始)
1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #include <algorithm> 5 #define mem(a,b) memset(a,b,sizeof(a)); 6 using namespace std; 7 #define INF 0x3f3f3f3f 8 typedef long long ll; 9 const int maxn = 50005; 10 int n,k,vis[10],ans; 11 char s[10][10]; 12 void dfs(int r,int t) { 13 if(t == k) {//当棋子总数为k时,停止搜索,返回上一层 14 ans++; 15 return ; 16 } 17 for(int i = r + 1; i < n; i++) {//从r+1行到n-1行搜下一个'#' 18 for(int j = 0 ; j < n; j++) { 19 if(s[i][j] == '#'&&!vis[j]){ 20 vis[j] = 1; 21 dfs(i,t+1); 22 vis[j] = 0; 23 } 24 } 25 } 26 } 27 int main() 28 { 29 30 31 while(cin >> n >> k) { 32 ans = 0; 33 if(n == -1 && k == -1) 34 break; 35 for(int i = 0; i < n; i++) { 36 cin >> s[i]; 37 } 38 for(int i = 0; i < n; i++) { 39 for(int j = 0; j < n; j++) { 40 if(s[i][j] == '#') { 41 vis[j] = 1;// 标记纵坐标 42 dfs(i,1); 43 vis[j] = 0; 44 } 45 } 46 } 47 cout << ans << endl; 48 } 49 return 0; 50 }