[kuangbin系列]专题一 简单搜索
好好学习刷题啊,从刷水题做起!
A - 棋盘问题
Time Limit:1000MS Memory Limit:10000KB 64bit IO Format:%I64d & %I64u
在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。
要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆放方案C。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 5 using namespace std; 6 7 const int MAX = 8 + 3; 8 9 char chess[MAX][MAX]; 10 bool visy[MAX]; 11 int n, k, ans; 12 13 void dfs(int x, int cnt) 14 { 15 if (cnt == k) { 16 ++ans; 17 return; 18 } 19 if (x >= n) return; // 返回条件 20 21 for (int j = 0; j < n; ++j) { 22 if (chess[x][j] == '#' && visy[j] == 0) { 23 visy[j] = 1; // 对当前按列进行标记 24 dfs(x+1, cnt+1); // 对下一行进行以上相同的操作 25 visy[j] = 0; // 回溯 26 } 27 } 28 dfs(x+1, cnt); // 这里是本题的一个思考点: 29 // 对于k<n的情况,可以只在n行中选取k行即可, 30 // 所以在向下一行的情况下cnt可以不加 31 32 return; 33 } 34 35 int main() 36 { 37 while(scanf("%d%d", &n, &k) && n != -1 && k != -1) { 38 ans = 0; 39 memset(visy, 0, sizeof(visy)); 40 memset(chess, 0, sizeof(chess)); 41 for (int i = 0; i < n; ++i) 42 scanf("%s",chess[i]); 43 44 dfs(0,0); 45 46 printf("%d\n", ans); 47 } 48 49 50 51 return 0; 52 }
浙公网安备 33010602011771号