poj1321棋盘问题(深搜)

来源:互联网 发布:超跑和f1知乎 编辑:程序博客网 时间:2024/06/07 03:58

题目链接:click here~

题目解析: 类似于八皇后问题,逐行进行搜索,然后要判断不能在同一列中,由于k<n,所以在原先八皇后问题的基础之上也即for循环之后再加一个dfs().

代码如下:

#include<cstdio>#include<cstring>char chess[10][10];int flag[10][10];int ans;int n,k;bool judge(int r,int c){    for(int i=r-1;i>=0;i--)       if(flag[i][c])  return false;    for(int j=r+1;j<=n-1;j++)       if(flag[j][c])  return false;    return true;}void dfs(int row,int num){    if(num==k)    {        ans++;        return;    }    if(row==n)      return;    for(int i=0;i<n;i++)   //对每一列进行搜索    {        if(chess[row][i]=='#'&&!flag[row][i]&&judge(row,i))   //说明当前位置可以放棋子        {            flag[row][i]=1;            dfs(row+1,num+1);            flag[row][i]=0;        }    }    dfs(row+1,num);}int main(){    while(scanf("%d%d",&n,&k)!=EOF)    {        if(n==-1&&k==-1)          break;        for(int i=0;i<n;i++)          scanf("%s",chess[i]);        memset(flag,0,sizeof(flag));        ans=0;        dfs(0,0);        printf("%d\n",ans);    }    return 0;}

0 0
原创粉丝点击