Posted on 2009-08-23 19:50
Uriel 阅读(309)
评论(0) 编辑 收藏 引用 所属分类:
POJ 、
搜索
这类的DFS做了好几道了。。终于感觉做起来轻松一点了。。

/**//* Problem: 3194 User: Uriel
Memory: 384K Time: 16MS
Language: C++ Result: Accepted */
#include<stdio.h>
#include<stdlib.h>
#include<string.h>


int ax[]=
{0,0,1,-1};

int ay[]=
{1,-1,0,0};
int i,j,n,x[110][110],s[110][250],f[110][110],k;

bool Jge()


{
for(int i=1;i<=n;i++)

{
for(int j=1;j<=n;j++)

{
if(x[i][j])return false;
}
}
return true;
}

int Pre(int x,int y)


{
if(x<=0 || x>n || y<=0 || y>n)
return 1;
else
return 0;
}

void DFS(int a,int b)


{
int j;
int tx,ty;
for(j=0;j<4;j++)

{
tx=ax[j]+a;
ty=ay[j]+b;
if(!Pre(tx,ty) && x[tx][ty]==i && !f[tx][ty])

{
f[tx][ty]=1;
x[tx][ty]=0;
DFS(tx,ty);
}
}
}

int main()


{
while(1)

{
scanf("%d",&n);
if(n==0)break;
memset(x,0,sizeof(x));
for(i=1;i<n;i++)

{
for(j=0;j<2*n;j++)

{
scanf("%d",&s[i][j]);
}
for(j=0;j<2*n;j+=2)

{
x[s[i][j]][s[i][j+1]]=i;
}
}
for(i=1;i<n;i++)

{
for(j=1;j<=n;j++)

{
if(!x[i][j])x[i][j]=n;
}
}
memset(f,0,sizeof(f));
for(i=1;i<=n;i++)

{
for(j=1;j<=n;j++)

{
for(k=1;k<=n;k++)

{
if(x[j][k]==i)

{
DFS(j,k);
}
}
}
}
if(Jge()==false)printf("wrong\n");
else
printf("good\n");
}
system("PAUSE");
return 0;
}

感觉大概套路就是这样了。。POJ 1562 3620 ...
菜鸟刚学搜索,不足之处还请路过的大牛们指教