搜索小练#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号