Problem 救公主續

2021-07-15 23:55:33 字數 2603 閱讀 3735

標籤(空格分隔): 未分類

description

公主又被魔王抓去了!公主被關在乙個矩形迷宮裡,有的位置有守衛把守。年邁的國王正是心急如焚,告招天下勇士來拯救公主。不過公主早已習以為常,她深信智勇的騎士肯定又會將她救出。初始時騎士在迷宮左上角(0,0)處,公主在右下角(n-1,m-1),騎士可向上下左右四個方向走,每走一步需要乙個單位時間,如果該位置有守衛,需要消耗一定的時間來對付,問騎士最快需要多少時間到達公主。

input

輸入有多組,每組第一行兩個不超過100的整數n,m,表示矩形的長和寬,接下的n行m列代表迷宮,』x』代表障礙物,』.』代表道路,數字則表示該位置有守衛,對付該守衛需要的時間為這個數值

output

輸出騎士到公主位置的最小時間,格式見樣例,若不能到達輸出「god please help our poor hero.」

sample input

5 6

.xx.1.

..x.2.

2…x.

…xx.

***xx.

5 6

.xx…

..xx1.

2…x.

…xx.

***xx.

sample output

it takes 13 seconds to reach the target position.

god please help our poor hero.

hint

**

/*

** author: shydream

** time: 2016.7.31

** 這裡面有幾處問題,做了標記,後面會討論

**/#include

#include

#include

#include

#define maxn 110

using

namespace

std;//剛上來少了這一句,結果後邊一大串的命名錯誤 ;

//t 1:優先佇列

struct node

};int n,m;

char maps[maxn][maxn]; //地圖 ;

int vis[maxn][maxn]; //改點座標是否被訪問過 ;

int dirs[4][2]=; //移動方向為下、上、左、右

void bfs()

//t 2:該處的剪枝

if(vis[pre.x][pre.y]!=0&&pre.time>vis[pre.x][pre.y])

/*如果當前座標被訪問過而且當前的時間大於vis中儲存的時間,就放過這乙個元素,進行下乙個出隊操作 ; */

continue;

for(i=0;i<4;i++) //4個方向的移動;

// t 4:剪枝--入隊的判定

if(vis[nxt.x][nxt.y]==0||vis[nxt.x][nxt.y]>nxt.time) //如果此點未被訪問過或者現在的時間小於或者等於曾經訪問過的時間,入隊; }}

printf("god please help our poor hero.\n");

}int main()

,執行下面的printf時輸出的確實3,改為maps[1][0]後輸出的確實乙個負數,這一點有點不懂; */

cin>>maps[i][j];

}getchar();

//這一句應該沒有用了,剛上來是為了結合scanf吸收換行符用的

} bfs();

//printf("%d",maps[1][1]-'0');測試

}return

0;}

t 3:對於此處要多加 1 ,是因為如果改點有數字,需要先加上該數字;再加 1 是因為從上一步移動到這一步本身就需要 1 秒 ;

t 4:剪枝,(1)如果此點已被它前面某一移動方式訪問過 ,而且 此點所用的時間又大於前面的訪問過的,那麼它就要被捨棄,不能入隊

因為前面某一點在接下來的移動過程是跟它完全一樣的,而它的時間大於前面的,那麼我們就沒有讓他入隊的必要了;(2)同時這也

可以避免重複性移動,比如:「當前位置,記錄時間—>向下移動,記錄時間—>向上移動,記錄時間 」,這種移動又回到了原來

的 位置,但是時間增加了,因此捨棄該狀態的入隊;

t 2:剪枝, 在這一點處後來又被別的移動方式訪問過,但是後來到達改點所用時間更少,而且兩者在接下來的移動是完全一樣的 ,後來的所用時間

更少,那麼當前的時間多,就直接捨棄;

t 1:至於為什麼使用優先佇列,那是因為我們規定的方向 i 從 0 到 3 依次為下、上、左、右,那麼在同一層次的移動方式中 總是下先入隊,其他的後入隊

想象這樣一種結果:我們取出隊首元素,但是這時候它的時間又大於新隊首的 時間,恰好該狀態滿足條件到達目的地,那麼我們就結束了操作;

然而新的隊首元素加入出對也能滿足條件,那麼它的時間必定比之前的要小,所以我們輸出的結果並不是真正的答案。使用優先佇列則保證了每次出隊的

為佇列中所用時間最少的。

搜尋 救公主問題

搜尋 救公主問題 可憐的公主在一次次被魔王擄走一次次被騎士們救回來之後,而今,不幸的她再一次面臨生命的考驗。魔王已經發出訊息說將在t時刻吃掉公主,因為他聽信謠言說吃公主的肉也能長生不老。年邁的國王正是心急如焚,告招天下勇士來拯救公主。不過公主早已習以為常,她深信智勇的騎士lj肯定能將她救出。現據密探...

C語言小遊戲 英雄打惡龍救公主

題目 編寫乙個小遊戲,組團打boss,建立兩位英雄hero1,hero2,英雄包含生命值hp與攻擊力,建立乙個boss,同樣包含生命值與攻擊力。屬性範圍自定義。進行回合制pk,列印出pk過程。使用 sleep 英雄方人員全部倒下,列印 遊戲失敗,是否繼續。boss倒下,列印 恭喜你勇士,成功打敗惡龍...

中國救美國,誰來救中國?

因為美國的次貸危機引發眾多金融機構的破產,進而影響美國金融機構的正常運轉,並有可能導致整個金融體系的崩潰。原因就是全世界的國家和人民相信美 國人,單是中國 借給美國人的錢就有差不多上萬億美元 所以,都樂意借錢給美國人花。結果放縱了美國人,放縱美國人高消費。現在美國人還不起款,賴賬 了,美國金融機構急...