HDU-1010 tempter of the bone 骨頭的誘惑/233

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章