题意:有一个n*n的矩阵,’#’处可以放棋子,给出k个棋子要放入棋盘中,棋盘的上的棋子任意两个不能在同一行和同一列,问几种放法。
题解:棋盘8*8,暴力的dfs就可以。
#include <stdio.h>
#include <string.h>
#include <vector>
using namespace std;
const int N = 10;
char str[N];
int vis[N], n, k, res;
vector<int> g[N];
void dfs(int cur, int cnt) {
if (cnt == k) {
res++;
return;
}
if (cur == n)
return;
dfs(cur + 1, cnt);
for (int i = 0; i < g[cur].size(); i++) {
int c = g[cur][i];
if (!vis[c]) {
vis[c] = 1;
dfs(cur + 1, cnt + 1);
vis[c] = 0;
}
}
}
int main() {
while (scanf("%d%d", &n, &k) && n != -1) {
for (int i = 0; i < n; i++) {
g[i].clear();
scanf("%s", str);
for (int j = 0; j < n; j++)
if (str[j] == '#')
g[i].push_back(j);
}
res = 0;
dfs(0, 0);
printf("%d\n", res);
}
return 0;
}