Guarding the Chessboard UVA - 11214

搞不明白,为甚么迭代加深搜索的时候dfs一定要传参数maxn,不传就错,我也是很无奈,求大佬指点。

#include<cstdio>
#include<cstring>
using namespace std;
int vis[4][1000];
int op[100][100];
int n,m;
int n_m;
bool ok()
{
    for(int i=0;i<n_m;i++)
    {
        int x = i/m;
        int y = i%m;
        if(op[x][y]==1&&vis[0][x]==0&&vis[1][y]==0&&vis[2][x+y]==0&&vis[3][y-x+n]==0) return false;
    }
    return true;
}
bool dfs(int loc,int cur,int l)
{
   if(cur==l)
   {
       if(ok()) return true;
       return false;
   }
   for(int j=loc;j<n_m;j++)
   {
       int x = j/m;
       int y = j%m;


           //if(vis[0][x]==1||vis[1][y]==1||vis[2][x+y]==1||vis[3][y-x+15]==1) continue;
           int t1 = vis[0][x];
           int t2 = vis[1][y];
           int t3 = vis[2][x+y];
           int t4 = vis[3][y-x+n];
           vis[0][x]=vis[1][y]=vis[2][x+y]=vis[3][y-x+n]=1;
           if( dfs(j,cur+1,l) ) return true;
           vis[0][x]=t1;
           vis[1][y]=t2;
           vis[2][x+y]=t3;
           vis[3][y-x+n]=t4;

    }
   return false;
}
int main()
{
    char cc;
    int T = 0;
    while(~scanf("%d",&n))
    {
        if(n==0)break;
        ++T;
        scanf("%d",&m);
        n_m = n*m;
        memset(vis,0,sizeof(vis));
        memset(op,0,sizeof(op));
        for(int i=0;i<n;i++)
            for(int j=0;j<m;j++)
           {
             scanf(" %c",&cc);
             if(cc=='X') op[i][j]=1;
           }
           int maxn;
           for(maxn=0; ;maxn++)
           {
               //memset(vis,0,sizeof(vis));
               if(dfs(0,0,maxn)) break; // 为甚么不传参数maxn就错误
           }
           printf("Case %d: %d\n",T,maxn);
    }
    return 0;
}

水波。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值