搞不明白,为甚么迭代加深搜索的时候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;
}
水波。