HDU 1010

http://acm.hdu.edu.cn/showproblem.php?pid=1010

一道深搜+剪枝  纠结了一晚上加一上午 。。。

开始自己写的代码没过  后来又看了xcy学长(

xcyx学长的代码很清晰 简洁 实在佩服    在此表示崇拜

)的 结题报告写的  中间还是改了很长时间错误  足见代码功底有多差了    

 

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int visit[11][11],
XX[4]={1,-1,0,0},YY[4]={0,0,1,-1};
int N,M,T,bx,by,ex,ey;
bool flag;
char a[11][11];

void DFS(int r,int c,int step)
{
int k,Kx,Ky;
if(r==ex&&c==ey)
{
if(step==T)flag=true;
return;
}


// int dis=abs(r-ex)+abs(c-ey);
if(flag||step>=T) //(dis+T-step)%2!=0||
return;

for(k=0;k<4;k++)
{
Kx=r+XX[k];
Ky=c+YY[k];
if(Kx<1||Kx>N||Ky<1||Ky>M)
continue;

if(a[r][c]=='X')
continue;

if(!visit[Kx][Ky])
{
visit[Kx][Ky]=1;
DFS(Kx,Ky,step+1);
visit[Kx][Ky]=0;
}

//if(flag)return;
}
// return;
}

int main()
{
int i,j;
char ch;
while(cin>>N>>M>>T&&(N+M+T))
{

for(i=1;i<=N;i++)
for(j=1;j<=M;j++)
{
cin>>ch;
a[i][j]=ch;
if(ch=='S') bx=i,by=j;
if(ch=='D') ex=i,ey=j;
}
int dis=abs(bx-ex)+abs(by-ey);

if(dis>T||(dis+T)%2!=0)
{
cout<<"NO\n";
continue;

}


flag=false;
memset(visit,0,sizeof(visit));
visit[bx][by]=1;
DFS(bx,by,0);
if(flag)
cout<<"YES\n";
else cout<<"NO\n";
}
return 0;
}

 

 

下面是那个令人纠结 的代码  先贴上 有空再找错

 

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int a[80][80],visit[80][80],
XX[4]={1,-1,0,0},YY[4]={0,0,1,-1};
int N,M,T,s_x,s_y,e_x,e_y;

bool check(int i,int j)
{
if(1<=i&&i<=N&&1<=j&&j<=M&&visit[i][j]==0&&a[i][j])
return true;
else return false;
}

bool DFS(int h,int lie,int time)
{ bool b;
int k;

time++;
visit[h][lie]=1;//访问过了
// if((abs(h-e_x)+abs(lie-e_y))%2!=(T-time)%2)
// {
// return false;
// }
if(h==e_x&&lie==e_y&&time==T)
{
return true;
}


for(k=0;k<4;k++)
{ if(check(h+XX[k],lie+YY[k]))
{
b=DFS(h+XX[k],lie+YY[k],time);

if(b)
return true;
}

}


return false;

}

int main()
{
int i,j,sum;
char ch;
//while(scanf("%d%d%d",&N,&M,&T)!=EOF&&(N+M+T))
while(cin>>N>>M>>T&&(N+M+T))
{
sum=0;
memset(visit,0,sizeof(visit));//0表示没被访问
for(i=1;i<=N;i++)
for(j=1;j<=M;j++)
{
//scanf("%c",&ch);
cin>>ch;

if(ch=='S')
{
s_x=i;
s_y=j;
a[i][j]=1;
}

if(ch=='D')
{
e_x=i;
e_y=j;
a[i][j]=1;
}

if(ch=='X')
{
a[i][j]=0;
sum++;
}


if(ch=='.')
a[i][j]=1; //1通路 0不通
}

if(abs(s_x-e_x)+abs(s_y-e_y)>N*M-sum
||(abs(s_x-e_x)+abs(s_y-e_y))%2!=T%2)
{
cout<<"NO"<<endl;
continue;
}

if(DFS(s_x,s_y,-1))
{
cout<<"YES"<<endl;
}

else
{
cout<<"NO"<<endl;
}


}
return 0;
}



 

 

 

 



posted @ 2011-11-22 11:51  快乐.  阅读(186)  评论(0编辑  收藏  举报