#include <iostream>
using namespace std;
const int MAX = 10;
char map[MAX][MAX];
int vis[MAX], n, k, ans, sum;
//地图的输入
void init()
{
int i, j;
for (i = 0; i < n; i++){
getchar();
for (j = 0; j < n; j++){
scanf("%c", &map[i][j]);
}
}
return ;
}
//dfs搜索
void dfs(int a, int b)
{
int i, j;
//如果等于棋数就在方案数上加一
if (sum == k){
ans++;
return ;
}
//将当前列置为不可放棋子
vis[b] = 1;
//dfs继续向下一行进行搜索
for (i = a+1; i < n; i++){
for (j = 0; j < n; j++){
if (map[i][j] == '#' && !vis[j]){
sum++;//可放棋子数加一
dfs(i, j);//继续向下搜索
sum--;//回溯时候,棋子数减一
}
}
}
//回溯时候,将其列置为可放棋子
vis[b] = 0;
}
void solve()
{
int i, j;
for (i = 0; i < n; i++){
for (j = 0; j < n; j++){
if (map[i][j] == '#'){
sum = 1;
dfs(i, j);
}
}
}
cout << ans << endl;
}
int main()
{
while (cin >> n >> k){
if (n == -1 && k == -1) break;
memset(vis, 0, sizeof(vis));
sum = ans = 0;
init();
solve();
}
system("pause");
}
poj 1321 棋盘问题
最新推荐文章于 2022-07-29 20:54:45 发布