您的位置:首页 > 其它

poj1321 棋盘问题 回溯

2017-07-10 23:43 253 查看
中文题:题目链接

八皇后问题,回溯即可

代码行下标从1开始,列下标从0开始,数组u初始设为-1

#include<cstdio>
#include<iostream>
using namespace std;
char a[10][10];  //棋盘
int n,k;
int u[15];  //u[i]表示第i行棋子放在了第j列
long long  ans;
bool pan(int i){ //判断第i行是否合法
for(int j=1;j<i;j++)
if(u[j]==u[i])
return false;
return true;
}
void dfs(int i,int sum){  //搜到第i行时已经有放了sum个棋子
//cout<<i<<" "<<sum<<" "<<ans<<" -1"<<endl;
if(sum==k||i>n){
if(sum==k)
ans++;
return ;
}
if(n-i>=k-sum){  //剪个枝
u[i]=-1;
dfs(i+1,sum);
}
for(int j=0;j<n;j++)
if(a[i][j]=='#'){
u[i]=j;
if(pan(i)){
dfs(i+1,sum+1);
u[i]=-1;
}
}
}

int main(){
while((cin>>n>>k)&&(n!=-1||k!=-1)){
for(int i=0;i<14;i++)
u[i]=-1;
ans=0;
for(int i=1;i<=n;i++)
cin>>a[i];
dfs(1,0);
cout<<ans<<endl;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法 ACM poj