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

来源:互联网 发布:减员增效人员优化散文 编辑:程序博客网 时间:2024/05/21 17:58

题目链接: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;} 
原创粉丝点击