/*
2553589 2011-06-07 21:27:12 Accepted 2110 C++ 650 188 MDK */
struct fix
{
int x,y;
};
int n,m,tim,s1,s2;
bool isescape=0;
char mat[MAXN][MAXN];
fix p[]={{1,0},{-1,0},{0,1},{0,-1}};
void dfs(int x,int y,int timt)
{
if(x==s1&&y==s2&&timt==tim)
{
//DB("-=-=-=");
isescape=1;
return;
}
int temp=(tim-timt)-abs(x-s1)-abs(y-s2);
if(timt>tim) return;
if(temp<0||temp%2) return;
for(int i=0;i<4;i++)
{
int a=x+p[i].x;int b=y+p[i].y;
if(a<0||b<0||a>=n||b>=m||mat[a][b]=='X') continue;
else
{
mat[a][b]='X';
//PP(n,m,mat);
dfs(a,b,timt+1);
if(isescape)
{
return;
//DB("----");
}
mat[a][b]='.';
//PP(n,m,mat);
}
}
return ;
}
int main()
{
freopen("D:\\1.txt","r",stdin);
while(SCFT(n,m,tim)!=EOF&&n)
{
getchar();
int a,b,flag=1;isescape=0;
SET(mat,'\0');
F(i,n)
{
F(j,m)
{
SCFC(mat[i][j]);
if(flag&&mat[i][j]=='S')
flag=0,a=i,b=j;
if(mat[i][j]=='D')
s1=i,s2=j;
}
getchar();
}
mat[a][b]='X';
//DB(a<<"-"<<b);
//PP(n,m,mat);
dfs(a,b,0);
if(isescape)
printf("YES\n");
else
printf("NO\n");
}
}
水题,裸搜索,其实中间那个打印出来路径挺直观!
不加剪枝的话很容易超时,DFS的劣势就是很“笨”,耗时太多,如果他们的最短距离都不能走到或者不能在基数时间过去就return回去。