思路:
分层查找,逐行深搜。
注意k < n时的处理。
1 #include <map> 2 #include <stack> 3 #include <queue> 4 #include <math.h> 5 #include <stdio.h> 6 #include <string.h> 7 #include <iostream> 8 #include <limits.h> 9 #include <algorithm> 10 #define LL long long 11 #define min(a,b) (a>b?b:a) 12 #define max(a,b) (a>b?a:b) 13 #define eps 1e-9 14 #define INF 1 << 30 15 using namespace std; 16 17 int Ans; 18 int n, m; 19 char Map[10][10]; 20 int vis[10]; 21 22 void DFS(int x, int num) 23 { 24 if(num == n) 25 { 26 Ans++; 27 return ; 28 } 29 if(x > n) 30 return ; 31 for(int i = 0; i < m; i++) 32 { 33 if(Map[x][i] == '#' && !vis[i]) 34 { 35 vis[i] = 1; 36 DFS(x+1, num+1); 37 vis[i] = 0; 38 } 39 } 40 DFS(x+1, num); //这里是难点,当k<n时,x在等于n之前就可能已经把全部棋子放好 41 //又由于当全部棋子都放好后的某个棋盘状态已经在前面循环时记录了 42 //因此为了处理多余行,令当前位置先不放棋子,搜索在下一行放棋子的情况 43 return ; 44 } 45 46 void run() 47 { 48 while(~scanf("%d%d%*c", &m, &n)) 49 { 50 if(m == -1 && n == -1) 51 break; 52 memset(Map, 0, sizeof(Map)); 53 memset(vis, 0, sizeof(vis)); 54 for(int i = 0; i < m; i++) 55 { 56 for(int j = 0; j < m; j++) 57 scanf("%c", &Map[i][j]); 58 getchar(); 59 } 60 Ans = 0; 61 DFS(0, 0); 62 printf("%d ", Ans); 63 } 64 } 65 66 int main(void) 67 { 68 run(); 69 70 return 0; 71 }