搜索小练#1
#include <cstdio>
#include <iostream>
#include <cstring>
#define INF 214474444
using namespace std;
int n, k, tot, stp;
int a[10][10], vis[10];
char s[10];
inline void dfs (int x) {
if (stp == k) {
++ tot;
return;
}
if (x > n) return;
for (int i = 1; i <= n; ++ i)
if (!vis[i] && a[x][i] == 1) {
vis[i] = 1, ++ stp;
dfs (x+1);
vis[i] = 0, -- stp;
}
dfs (x+1);
}
int main () {
while (cin >> n >> k) {
if (n == -1 && k == -1) break;
tot = stp = 0;
memset (vis, 0, sizeof vis);
memset (a, 0, sizeof a);
for (int i = 1; i <= n; ++ i) {
scanf ("%s", s+1);
for (int j = 1; j <= n; ++ j) s[j] == '#' ? a[i][j] = 1 : a[i][j] = 0;
}
dfs (1);
cout << tot << '\n';
}
return 0;
}
/*
2 1
#.
.#
4 4
...#
..#.
.#..
#...
-1 -1
*/
PS:
1.\(dfs\)参数只可以有一个
2.\(vis\)记录每一列是否有棋子放置

浙公网安备 33010602011771号