12D:迷阵
總時(shí)間限制:1000ms內(nèi)存限制:65536kB描述
小Z每年都會(huì)為程設(shè)課出一道大作業(yè),荼毒學(xué)弟學(xué)妹,可謂罪大惡極不可饒恕。
終于有一天,神明也看不下去了,他喚醒上古四大神獸,決定圍困小Z,威懾一番。
于是,在小Z下一次醒來時(shí),他便發(fā)現(xiàn)自己已然身處不知名的所在,抬眼所見,只有滾滾迷霧席卷而來,霧靄深處還隱隱約約閃著雷光。
低頭一看,地上有一紅漆木盒,上書四個(gè)大字“求生之道”,打開一看,竟是一臺(tái)電腦。
電腦上空蕩蕩的,只有三個(gè)文件,一個(gè)是 Visual Studio 的安裝包,一個(gè)是 README.txt,還有一個(gè)是 map.png。
小Z想都沒想就開始安裝 VS,在漫長(zhǎng)的等待中,他打開了 README.txt:
“汝罪大惡極,故略施薄懲。此乃四象迷陣,有神獸鎮(zhèn)守,踏錯(cuò)一步,險(xiǎn)象環(huán)生。如欲得生,須觀 map.png,尋得最短出路。”
迷陣是 m 行 n 列的格子矩陣,行、列從 1 開始數(shù)。小Z出生在左上角,也就是第 1 行,第 1 列的格子,迷陣的出口在第 m 行,第 n 列。
迷陣中有三種格子:
1. 空格子,以英文句點(diǎn)'.'記。出生點(diǎn)和出口都是空格子。
2. 墻,以井號(hào)'#'記。小Z無法移動(dòng)到墻上。
3. 陷阱,以星號(hào)'*'記。小Z移動(dòng)到陷阱的瞬間會(huì)受到來自上古神獸的 1 點(diǎn)傷害(生命 - 1),但是離開陷阱的瞬間不會(huì)再受到傷害。
小Z的生命有 H 點(diǎn),當(dāng)生命到 0 的瞬間他就會(huì)被傳送回出生點(diǎn)。
小Z的每次行動(dòng)是向上下左右的四個(gè)方向之一移動(dòng)一格。不能移動(dòng)出界,不能移動(dòng)到墻上,但是可以移動(dòng)到陷阱上。
小Z需要在短短3個(gè)小時(shí)內(nèi)寫出程序,算出自己最少要走多少步才能走到出口。
但凡迷陣,必有生門。題目保證必定存在一條路徑使得小Z能夠走到出口。
輸入第一行是一個(gè)整數(shù) T,表示輸入包含 T 組數(shù)據(jù),分別是不同的平行時(shí)空下小Z所處的迷陣。
對(duì)于每組數(shù)據(jù),第一行包括三個(gè)整數(shù):m(2 <= m <= 255)、n(2 <= n <= 255)、H(1 <= H <= 5)。
接下來 m 行,每行是一個(gè)由符號(hào)組成的長(zhǎng)度為 n 的字符串,第 i 行的第 j 個(gè)字符表示矩陣中第 i 行第 j 列的格子的類型。
題目保證出生點(diǎn)和出口(左上角和右下角)都是空格子。輸出對(duì)于每組數(shù)據(jù),你需要輸出一行一個(gè)正整數(shù),表示小Z在這個(gè)迷陣中最少要走多少步才能走到出口。
題目保證小Z一定能走到出口。樣例輸入
2 2 2 3 .* #. 5 5 3 ..... ****. ..... .**** .....
樣例輸出
2 8
1 #include<iostream>
2 #include<cstring>
3 #include<queue>
4 using namespace std;
5 char a[260][260];
6 bool visited[260][260][6];
7 int dirx[4] = {0,0,1,-1};
8 int diry[4] = {1,-1,0,0};
9 int m, n, H;
10 struct node{
11 int x, y, step, h;
12 node(int xx, int yy, int ss = 0, int hh = H):x(xx),y(yy),step(ss),h(hh){}
13 };
14 queue<node>q;
15 int main(){
16 int t;
17 cin>>t;
18 while(t--){
19 cin>>m>>n>>H;
20 memset(a, 0, sizeof(a));
21 memset(visited,0,sizeof(visited));
22 while(!q.empty()) q.pop();
23 int i, j;
24 for(i = 1; i <= m; i++)
25 for(j = 1; j <= n; j++)
26 cin>>a[i][j];
27 q.push(node(1,1));
28 visited[1][1][H] = true;
29 while(!q.empty()){
30 node no = q.front();
31 q.pop();
32 int hp = no.h, step = no.step;
33 if(no.x==m&&no.y==n){
34 cout<<no.step<<endl;
35 break;
36 }
37 for(int i = 0; i < 4; i++){
38 int nx = no.x+dirx[i];
39 int ny = no.y+diry[i];
40 if(a[nx][ny]=='.'&&!visited[nx][ny][hp]){
41 q.push(node(nx, ny,step+1, hp));
42 visited[nx][ny][hp] = true;
43 }
44 if(a[nx][ny]=='*'&&hp-1>0&&!visited[nx][ny][hp-1]){
45 q.push(node(nx, ny,step+1, hp-1));
46 visited[nx][ny][hp-1] = true;
47 }
48 }
49 }
50 }
51 return 0;
52 }
備注:這道題我WA了十次……對(duì)著AC代碼也看不出來哪錯(cuò)了,查到懷疑人生。
結(jié)果就求助x老師了。然后老師就幫我找到了問題出在哪里,雖然他沒有發(fā)現(xiàn)問題的本質(zhì)。我居然還能把初始化列表寫錯(cuò)! 把h(hh)寫成了h(H)。我服了我自己了。
我太愛x老師了,希望他能明白我對(duì)他的愛。
總結(jié)
- 上一篇: 如何访问 SAP Screen Pers
- 下一篇: 不思议迷宫机械祭坛放置什么物品 不思议迷