题目: hdu 1010;
预:
char map[10][10];
int flag,Xnum,Sx,Sy,Dx,Dy;
int dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
DFS(int x,int y,int time):
if(x<=0||x>n||y<=0||y>m) return;
if(flag==1) return;
if(x==Dx&&y==Dy&&time==t)
{
flag=1;
return;
}
//奇偶性剪枝:不管怎么绕,最短距离+偶数,来源:百科
int temp=(t-time)-abs(x-Dx)-abs(y-Dy);
if(temp<0||temp&1) return;
for(int i=0;i<4;i++)
{
int x1=x+dir[i][0];
int y1=y+dir[i][1];
if(map[x1][y1]!='X')
{
map[x1][y1]='X';
DFS(x1,y1,time+1);
map[x1][y1]='.';
}
}
return;
main:
Xnum=0;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>map[i][j];
if(map[i][j]=='S')
{
Sx=i;
Sy=j;
}
if(map[i][j]=='D')
{
Dx=i;
Dy=j;
}
if(map[i][j]=='X')
{
++Xnum;
}
}
flag=0;
map[Sx][Sy]='X';
if(n*m-Xnum<=t)
{
cout<<"NO"<<endl;
continue;
}
DFS(Sx,Sy,0);
if(flag)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}