hdu1010 Tempter of the Bone
方法:dfs
思想:由于本题中规定只有在固定时刻到达目的点才能逃脱,
不能提早,更不能延迟,故不能用bfs。可以用dfs找出所有情况,
若有可行解,直接返回即可。本题比较郁闷的是,在tzc上将方向
数组int dir[4][2]稍微变动两下,就会超时。这也是今后出现TLE时
该考虑的重要的一点吧,可以作为经验教训。
#include<stdio.h>
#include<math.h>
char map[11][11];
int dir[4][2]={{0,-1},{0,1},{1,0},{-1,0}};
int t;
int flag;
int n,m;
int dx,dy;
void dfs(int i,int j,int step)
{
int x,y;
if(i==dx&&j==dy&&step==t)
flag=1;
if(step>t)
return;
if(flag)
return;
if((t-step)%2!=(abs(dx-i)+abs(dy-j))%2)//如果奇偶性不同就返回
return;
for(int u=0;u<4;u++)
{
x=i+dir[u][0];
y=j+dir[u][1];
if(x>=0&&y>=0&&x<n&&y<m)
{
if(map[x][y]!='X')
{
map[x][y]='X';
dfs(x,y,step+1);
map[x][y]='.';
}
}
}
}
int main()
{
int i,j,x,y,k;
while(scanf("%d%d%d",&n,&m,&t)!=-1)
{
k=0;
if(n==0&&m==0&&t==0)
break;
getchar();
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
scanf("%c",&map[i][j]);
if(map[i][j]=='S')
{
x=i;
y=j;
map[i][j]='X';
}
if(map[i][j]=='D')
{
dx=i;
dy=j;k++;
}
if(map[i][j]=='.')
k++;
}
getchar();
}
if(k<t)
{
printf("NO\n");continue;
}
flag=0;
dfs(x,y,0);
if(flag)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}
/*
4 4 5
S.X.
..X.
..XD
....
3 4 5
S.X.
..X.
...D
0 0 0
*/

浙公网安备 33010602011771号