POJ-1321 题解
棋盘问题
题目大意
不规则n*n棋盘,放k个棋子,不能同行同列
有多少种结果
Time: 1000 ms
Memory: 10000 kB
解题思路及分析
搜索 回溯
按行搜索,再枚举列
具体看代码注释
AC代码
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
char mp[10][10];
bool vis[10];
int n, k, ans = 0;
// 搜索 i为行,num为已放置棋子个数
void dfs(int i, int num)
{
// 防止行越界
if (i > n)
{
return ;
}
// 全部放置
if (num == k)
{
ans++;
return ;
}
// 循环列,找可以放置的点(第i行第j列)
for (int j = 0; j < n; j++)
{
if (mp[i][j] == '#' && !vis[j])
{
vis[j] = true; // 标记列表示这一列已有
dfs(i + 1, num + 1);
vis[j] = false; // 回溯
}
}
// 这一行不放棋子时的搜索
dfs(i + 1, num);
// 由于k <= n 故可能某些行可能不需要放置
// 这里直接进入下一行的搜索
}
int main()
{
while (~scanf("%d%d", &n, &k) && (~n && ~k))
{
ans = 0;
memset(vis, 0, sizeof(vis));
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
scanf(" %c", &mp[i][j]);
}
}
dfs(0, 0);
printf("%d\n", ans);
}
return 0;
}