poj1321 DFS
一开始做题,看到每一个棋子不能放在同一行或者同一列,于是试着对棋盘所在的位置进行分析。我发现可以将列用一个标记数组来表示是否已经使用过,但是行的情况思考的不是很仔细,不知道如果一行上有多个棋盘情况该如何处理,其实只要枚举从头开始每一个位置即可。对于每一行,其实有时候可以跳过一行!!!记得回溯!!
#define _CRT_SECURE_NO_DEPRECATE #include<iostream> #include<algorithm> #include<stdio.h> #include<queue> #include<map> #include<cstring> #include<string> #include<memory> using namespace std; const int maxn=20; int s[maxn][maxn]; char c; int n, k, number, v[maxn]; void dfs(int row, int num) { if (num == k) { number++; return; } if (row > n) return; for (int i = 1; i <= n; i++) { if (s[row][i] == 1 && !v[i]) { v[i] = 1; dfs(row + 1, num + 1); v[i] = 0; } } dfs(row + 1, num); } int main() { while (scanf("%d%d", &n, &k) != EOF) { if (n == -1 && k == -1) break; number = 0; memset(s, 0, sizeof(s)); memset(v, 0, sizeof(v)); getchar(); for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { cin >> c; if (c == '#') s[i][j] = 1; } } dfs(1, 0); printf("%d\n", number); } return 0; }

浙公网安备 33010602011771号