棋盘问题
把放棋子分成一个个的小问题把放n行 一点点减少 变成放n-1行 n-2行 n-3行…#include <iostream>using namespace std;int ans;int n, x;string s[10];int dp[10];void dfs(int k, int x){if (x == 0){ans++;...
·
把放棋子分成一个个的小问题
把放n行 一点点减少 变成放n-1行 n-2行 n-3行…
#include <iostream>
using namespace std;
int ans;
int n, x;
string s[10];
int dp[10];
void dfs(int k, int x)
{
if (x == 0)
{
ans++;
return;
}
for (int i = k; i < n; ++i)
{
for (int j = 0; j < n; j++)
{
if (s[i][j] == '#')
{
int t = 0;
//检查同行
for (int p = 0; p < n; ++p)
{
if (s[i][p] == '*')
{
t = 1;
break;
}
}
//检查同列
for (int o = 0; o < n; o++)
{
if (s[o][j] == '*')
{
t = 1;
break;
}
}
//如果同行或同列有 就不行
if (t)
continue;
//能放的就给他标记一下
s[i][j] = '*';
// dp[j] = 1;
dfs(i + 1, x - 1);
s[i][j] = '#';
// dp[j] = 0;
}
}
}
}
int main()
{
while (1)
{
cin >> n >> x;
if (n == -1 && x == -1)
break;
ans = 0;
getchar();
for (int i = 0; i < n; ++i)
{
cin >> s[i];
}
dfs(0, x);
cout << ans << endl;
}
return 0;
}
更多推荐
所有评论(0)