MDeath-Kid

- M I T & Y
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

ZOJ 2110

Posted on 2011-06-07 21:26  MDeath-Kid  阅读(345)  评论(0编辑  收藏  举报
/*
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回去。