您的位置:首页 > 其它

POJ1321 棋盘问题 kaungbin-搜索入门-A

2017-07-29 23:19 218 查看
题目链接:POJ1321

题目大意:

给你一个nxn的棋盘(有的位置空缺”.”,有的位置能放棋子“#”),要求你在棋盘能放棋子的地方放k个棋子,要求任意两个棋子,不能同行也不能同列,输出所有可能方案。

简单DFS,代码借鉴 原代码地址

因为本人刚刚接触这部分,所以对每一行代码加了注释,希望你能看懂- -

AC代码

/*
2017年7月29日22:53:39
POJ1321
简单搜索
kuangbin专题一 A
AC

*/
#include<stdio.h>
int n,k,ans;
const int maxn=10;
char pic[maxn][maxn];//记录棋盘
int col[maxn];//如果该列有棋子则置为1,否则为0

void dfs(int begin,int num){
for(int j=0;j<n;j++){
/*
满足放棋子的条件  当前棋盘可放&&当前列没有棋子
*/
if(pic[begin][j]=='#'&&col[j]==0){
if(num==1)//如果走到当前位置,并且只剩下一个棋子没有落下的时候,答案+1
ans++;
else{
//否则,将该位置放下棋子
col[j]=1;
/*
从下一行开始递归 h 代表行号
h 的范围 为从当前行 往下在填充 num-1行
n-1-(num-1)+1=n-num+1
*/
for(int h=begin+1;h<=n-num+1;h++){
dfs(h,num-1);
}
/*
如果走到这一步,证明已经从之前的递归跳回来
那么就将当前放下的棋子,拿走,即状态清空
*/
col[j]=0;
}
}
}
}

int main(){
while(scanf("%d%d",&n,&k)==2&&n!=-1){
ans=0;
/*一行一行的读入数据
*/
for(int i=0;i<n;i++){
scanf("%s",pic[i]);
}
/*
将每一列初始化为0
*/
for(int i=0;i<n;i++){
col[i]=0;
}
/*
棋盘行号标记为0- n-1
从上往下,i从0 取到 n-k
因为如果i=n-k的时候,剩下的  n-1-(n-k)=k-1行 必须填满棋子,所以
i 的取值范围为【0,n-k】
*/
for(int i=0;i<=n-k;i++){
dfs(i,k);
}
printf("%d\n",ans);

}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: