您的位置:首页 > 其它

poj 1321 -- 棋盘问题 (DFS)

2013-01-06 19:57 387 查看
dfs解决,逐行搜,注意当n<k时,要分成两个子问题,1、本行不放  2、本行放

递归解决即可

#include<iostream>
using namespace std;
int a[10][10];                   //记录棋盘信息
int pos[10];                     //[]内代表列数,由于每列只能放一个,数组记录当前列是否放过
int cnt;
int n,k;
void dfs(int x,int y)            //x是当前行,y是剩余棋子个数
{
if(x==0||y==0)               //终止条件
{
cnt++;
return ;
}
if(x>y)
dfs(x-1,y);               //子问题1
for(int i=1; i<=n; i++)       //子问题2
{
if(a[x][i]==1&&pos[i]==0)
{
pos[i]=1;
dfs(x-1,y-1);
pos[i]=0;
}
}
}
int main()
{
while(cin>>n>>k,n!=-1)
{
for(int i=0; i<=10; pos[i++]=0);
cnt=0;

for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
{
char s;
cin>>s;
if(s=='.')
a[i][j]=0;
else
a[i][j]=1;
}
if(k==0)
cout<<"0"<<endl;
else
{
dfs(n,k);
cout<<cnt<<endl;
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: