調皮的狗子在一個神廟內發現了一根骨頭,開心的撿起來走了,結果發現是陷阱。好吧,沒事套路狗子幹啥呢。狗子開始逃了,一秒鐘狗子只可以上下或左右移動一格,當前所在格子下一秒就塌了,不可以停留或者回頭。神廟大門只會在第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;
}
感覺可以了,下次被問了我應該一眼就想起來了,哈哈哈