这题开始用dfs做显然超时,纠结了好久百度了一下,居然用奇偶剪枝(奇偶剪枝是神马!!瞬间蒙了),看了一下代码才明白。。最短时间必须与给定的时间同奇同偶(可画图证明)+给定的时间必须大于最短时间。这题难在奇偶剪枝。。
代码:
#include<stdio.h>
#include<stdlib.h>
int n,m,k,sum ;
char s[8][8] ;
int dx[4]={1,-1,0,0},dy[4]={0,0,1,-1} ;
void dfs(int x,int y,int bu)
{
int nx,ny ;
if(bu==k||sum)
return ;
for(int i=0;i<4;i++)
{
nx=x+dx[i] ;
ny=y+dy[i] ;
if(nx>=0&&nx<n&&ny>=0&&ny<m&&s[nx][ny]!='X'&&bu<k)
{
if(s[nx][ny]=='D'&&bu+1==k)
{
sum=1 ;
return ;
}
else if(s[nx][ny]=='.'&&bu+1<k)
{
s[nx][ny]='X' ;
dfs(nx,ny,bu+1) ;
s[nx][ny]='.' ;
}
}
}
}
int main()
{
int i,j,ex,ey,rx,ry ;
while(scanf("%d%d%d",&n,&m,&k)!=EOF)
{
if(n+m+k==0)
break ;
for(i=0;i<n;i++)
{
scanf("%s",s[i]) ;
for(j=0;j<m;j++)
if(s[i][j]=='S')
{
ex=i ;
ey=j ;
}
else if(s[i][j]=='D')
{
rx=i ;
ry=j ;
}
}
sum=0 ;
int f=abs(rx-ex)+abs(ry-ey) ;
if(k>=f&&f%2==k%2)//奇偶剪枝!!!
{
dfs(ex,ey,0);
if(sum)
printf("YES\n") ;
else printf("NO\n") ;
}
else printf("NO\n") ;
}
return 0 ;
}