棋盘问题
在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆放方案C。
Input
在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆放方案C。
Output
对于每一组数据,给出一行输出,输出摆放的方案数目C (数据保证C<2^31)。
例:
2 1
#.
.#
4 4
…#
…#.
.#…
#…
-1 -1
2
1
#include<iostream>
#include<cstring>
using namespace std;
char chessboard[10][10];
int visit[10];
int num;//放入的棋子数
int way;//方案
int n,k;
void dfs(int row)
{
if(num==k)//找到一种方案
{
way++;
return;
}
if(row>n)return;//超边界返回
for(int i=0;i<n;i++)
{
if(chessboard[row][i]=='#'&&visit[i]==0)
{
visit[i]=1;//已访问
num++;//棋子使用数目加一
dfs(row+1);//搜索下一行
visit[i]=0;//搜索失败撤销标记
num--;
}
}
dfs(row+1);//棋盘可能有多余的空白行或空白列
//当前行不满足有“#”或不满足visit[i]==0时,将不能搜索下一行
//此操作可以使得深搜继续下一行
}
int main()
{
while(cin>>n>>k&&n!=-1&&k!=-1)
{
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
cin>>chessboard[i][j];
}
dfs(0);
cout<<way<<endl;
memset(visit,0,sizeof(visit));
way=0;
num=0;
}
return 0;
}