题意:n*n的棋盘,放m个棋子,要求任意两个棋不在同一行同一列。问有多少种放法。
n很小(n<=8),dfs搜呗。
int n, m, c = 0, ans = 0;
string s[N];
int vis[N];
void dfs(int x)
{
if (c == m)
{ // 满足条件答案++
ans++;
return;
}
if (x >= n)
return; // 一共只有n行
for (int i = 0; i < n; i++)
{
if (s[x][i] == '#' && !vis[i])
{ // 满足条件且该行没有棋子
vis[i] = 1; // 标记
c++; // 棋子数++
dfs(x + 1);
vis[i] = 0; // 取消标记(回溯)
c--; // 棋子数--
}
}
dfs(x + 1); // 可能第x行一个棋子都不取,就不用遍历
}
int main()
{
while (cin >> n >> m, n != -1 && m != -1)
{
c = 0, ans = 0; // 已经放的棋子数 答案
memset(vis, 0, sizeof vis);
for (int i = 0; i < n; i++)
cin >> s[i];
dfs(0);
cout << ans << endl;
}
}