题目链接: poj-1321
递归思想,只是本题只要判断不在一行或者一列,规定了棋子放置位置,故要增加判断条件。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
char a[10][10]; //记录棋盘位置
int book[10]; //记录一列是否已经放过棋子
int n, k;
int sum, m;//sum为摆放的方案数目,m为放上去的棋子数
void dfs(int x)
{
if (k == m)
{
sum++;
return;
}
if (x >= n)//边界
return;
for (int i = 0; i < n; i++)
{
if (book[i] == 0 && a[x][i] == '#')//判断条件
{
book[i] = 1;//回溯
m++;
dfs(x + 1);
book[i] = 0;
m--;
}
}
dfs(x + 1);
}
int main()
{
while (cin >> n >> k)
{
if (n == -1 && k == -1)
break;
sum = 0;
m = 0;
for (int i = 0; i < n; i++)
cin >> a[i];
memset(book, 0, sizeof(book));
dfs(0);
cout << sum << endl;
}
}