D - 棋盘问题
(解题日记)
简单的dfs
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<string.h>
using namespace std;
int x[1001] = { 0 };
int y[1001] = { 0 };
char M[1001][1001];
int n, k, ans = 0;
void dfs(int m,int t)
{
if (t == k)
{
ans++;
return;
}
if (m <= n)
{
for (int i = 1; i <= n; i++)
{
if (M[m][i] == '#'&&!x[m]&&!y[i])
{
x[m] = 1;
y[i] = 1;
dfs(m + 1, t + 1);
x[m] = 0;
y[i] = 0;
}
}
dfs(m + 1, t);
}
}
int main()
{
while (cin >> n >> k && n != -1 && k != -1)
{
ans = 0;
memset(x, 0, sizeof(x));
memset(y, 0, sizeof(y));
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
cin >> M[i][j];
}
}
dfs(1,0);
cout << ans << endl;
}
}