poj 1321 棋盘问题(n行中放任意k行)
n*n的棋盘摆K的棋子,任意两个棋子不能在同一行同一列
Sample Input
2 1
#. //# 可放
.#
4 4
...#
..#.
.#..
#...
-1 -1
Sample Output
2
1
1 # include <cstdio> 2 # include <cstring> 3 # include <iostream> 4 using namespace std ; 5 6 int map[10][10] ; 7 int x[10] ; 8 int sum ; 9 int n , k ; 10 11 void DFS(int src , int num) //逐行搜索,src为当前搜索行,num为已填充的棋子数 12 { 13 int i , j ; 14 if (num == k) 15 { 16 sum++ ; 17 return ; 18 } 19 20 if (src > n) 21 return ; 22 for (i = 1 ; i <= n ; i++) 23 { 24 if (map[src][i] && !x[i]) 25 { 26 x[i] = 1 ; 27 DFS(src+1 , num+1) ; 28 x[i] = 0 ; 29 } 30 } 31 DFS(src+1 ,num) ; //这里是难点,当k<n时,src在等于n之前就可能已经把全部棋子放好 32 //又由于当全部棋子都放好后的某个棋盘状态已经在前面循环时记录了 33 //因此为了处理多余行,令当前位置先不放棋子,搜索在下一行放棋子的情况 34 35 } 36 37 int main () 38 { 39 40 while(scanf("%d %d" , &n , &k) != EOF) 41 { 42 if (n == -1 && k == -1) 43 { 44 break ; 45 } 46 int i , j ; 47 char ch ; 48 sum = 0 ; 49 memset(x , 0 , sizeof(x)) ; 50 memset(map , 0 , sizeof(map)) ; 51 for (i = 1 ; i <= n ; i++) 52 for (j = 1 ; j <= n ; j++) 53 { 54 cin>>ch ; 55 if (ch == '#') 56 map[i][j] = 1 ; 57 } 58 59 DFS(1 , 0) ; 60 printf("%d\n" , sum) ; 61 } 62 63 64 return 0 ; 65 }