调皮的狗子在一个神庙内发现了一根骨头,开心的捡起来走了,结果发现是陷阱。好吧,没事套路狗子干啥呢。狗子开始逃了,一秒钟狗子只可以上下或左右移动一格,当前所在格子下一秒就塌了,不可以停留或者回头。神庙大门只会在第T秒的时候开启,狗子要准点到达,不可以迟到或早到。
地图比较小,最大6x6,时间也只有50不到,这道题用深度搜索实现,应该不是很难吧,开始代码注释。
#include <iostream>
#include <cmath>
using namespace std;
int step,dx,dy,x,y;
int go[4][2]={{-1,0},{0,1},{1,0},{0,-1}}; //这个数组实现上下左右的移动
char map[8][8];
bool dfs(int nx,int ny,int rs) //deep first search 函数
{
if(nx==dx&&ny==dy&&rs==step) //取一个点后,先确认是否为终点且时间是否恰好,门有不有打开
return 1;
int tmp=step-rs-abs(dx-nx)-abs(dy-ny); //剪纸环节,总步数先减去已走步数、距终点横向和纵向距离。
if(tmp<0||tmp%2) //如果小于0,就是可能绕太多路了,放弃向这边走,余2不为0的话,我不是理解得很好,问学长也是说跟绕路有关,有什么理解的可以评论一下哦
return 0;
rs++; //步数自增
for(int i=0;i<4;i++) //遍历四个方向
{
int xx=nx+go[i][0];
int yy=ny+go[i][1];
if(xx<0||xx>=x||yy<0||yy>=y||map[xx][yy]=='X') //碰到墙停止
continue;
map[nx][ny]='X'; //走过的点标记为墙,防止再走导致死循环
if(dfs(xx,yy,rs)) //递归,遍历其它点
return 1;
map[nx][ny]='.'; //遍历完成,返回时再复原地图
}
return 0;
}
int main()
{
while(cin>>x>>y>>step)
{
if(x==0&&y==0&&step==0)
return 0;
int sx,sy;
sx=9;sy=9;
dx=9;dy=9;
for(int i=0;i<x;i++) //读取地图并且标注起始点
{
scanf("%s",&map[i]);
for(int j=0;j<y;j++)
{
if(map[i][j]=='D')
{
dx=i;
dy=j;
}
if(map[i][j]=='S')
{
sx=i;
sy=j;
}
}
}
if((abs(dx-sx)+abs(dy-sy))>step) //太远了,给的步数不可能走到,剪枝
{
cout<<"NO"<<endl;
continue;
}
map[sx][sy]='X';
if(dfs(sx,sy,0)) //遍历开始,根据返回值判断有不有走到
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
return 0;
}
感觉可以了,下次被问了我应该一眼就想起来了,哈哈哈