生活随笔
收集整理的這篇文章主要介紹了
openjudge 拯救行动
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
4980:拯救行動
總時間限制:?
10000ms?內存限制:?
65536kB 描述
公主被惡人抓走,被關押在牢房的某個地方。牢房用N*M (N, M <= 200)的矩陣來表示。矩陣中的每項可以代表道路(@)、墻壁(#)、和守衛(x)。?
英勇的騎士(r)決定孤身一人去拯救公主(a)。我們假設拯救成功的表示是“騎士到達了公主所在的位置”。由于在通往公主所在位置的道路中可能遇到守衛,騎士一旦遇到守衛,必須殺死守衛才能繼續前進。?
現假設騎士可以向上、下、左、右四個方向移動,每移動一個位置需要1個單位時間,殺死一個守衛需要花費額外的1個單位時間。同時假設騎士足夠強壯,有能力殺死所有的守衛。
給定牢房矩陣,公主、騎士和守衛在矩陣中的位置,請你計算拯救行動成功需要花費最短時間。
輸入
第一行為一個整數S,表示輸入的數據的組數(多組輸入)
隨后有S組數據,每組數據按如下格式輸入?
1、兩個整數代表N和M, (N, M <= 200).?
2、隨后N行,每行有M個字符。"@"代表道路,"a"代表公主,"r"代表騎士,"x"代表守衛, "#"代表墻壁。輸出
如果拯救行動成功,輸出一個整數,表示行動的最短時間。
如果不可能成功,輸出"Impossible"樣例輸入
2
7 8
#@#####@
#@a#@@r@
#@@#x@@@
@@#@@#@#
#@@@##@@
@#@@@@@@
@@@@@@@@
13 40
@x@@##x@#x@x#xxxx##@#x@x@@#x#@#x#@@x@#@x
xx###x@x#@@##xx@@@#@x@@#x@xxx@@#x@#x@@x@
#@x#@x#x#@@##@@x#@xx#xxx@@x##@@@#@x@@x@x
@##x@@@x#xx#@@#xxxx#@@x@x@#@x@@@x@#@#x@#
@#xxxxx##@@x##x@xxx@@#x@x####@@@x#x##@#@
#xxx#@#x##xxxx@@#xx@@@x@xxx#@#xxx@x#####
#x@xxxx#@x@@@@##@x#xx#xxx@#xx#@#####x#@x
xx##@#@x##x##x#@x#@a#xx@##@#@##xx@#@@x@x
x#x#@x@#x#@##@xrx@x#xxxx@##x##xx#@#x@xx@
#x@@#@###x##x@x#@@#@@x@x@@xx@@@@##@@x@@x
x#xx@x###@xxx#@#x#@@###@#@##@x#@x@#@@#@@
#@#x@x#x#x###@x@@xxx####x@x##@x####xx#@x
#x#@x#x######@@#x@#xxxx#xx@@@#xx#x#####@ 樣例輸出
13
7 #include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
int f[220][220];
struct data
{int x,y,t;bool operator<(const data&a)const{return a.t<t;}
};
priority_queue<data> p;
int head,tail,i,j,n,m,x1,x2,y1,y2,t;
int x[10]={0,1,0,-1},y[10]={1,0,-1,0};
int main()
{scanf("%d",&t);for (int tt=1;tt<=t;tt++){memset(f,0,sizeof(f));while (!p.empty())p.pop();scanf("%d%d\n",&n,&m);for (i=1;i<=n;i++){char c[220];gets(c);for (j=1;j<=m;j++){if (c[j-1]=='@')f[i][j]=0;elseif (c[j-1]=='#')f[i][j]=1;elseif (c[j-1]=='r'){x1=i; y1=j; c[j-1]=0;}elseif (c[j-1]=='a'){x2=i; y2=j; c[j-1]=0;}elseif(c[j-1]=='x')f[i][j]=2;}}head=0; tail=1; data a;a.x=x1; a.y=y1;a.t=0; f[x1][y1]=1;p.push(a);bool pd=false;while (!p.empty()){data a=p.top();p.pop();for (i=0;i<=3;i++){data b;b.x=x[i]+a.x; b.y=y[i]+a.y; b.t=a.t+1;if (b.x>=1&&b.x<=n&&b.y>=1&&b.y<=m)if (f[b.x][b.y]==0){f[b.x][b.y]=1;p.push(b);}elseif (f[b.x][b.y]==2){b.t++;f[b.x][b.y]=1;p.push(b);}if (f[x2][y2]==1){cout<<b.t<<endl;pd=true;break;}}if (pd) break;}if (!pd) cout<<"Impossible"<<endl;}
}//廣搜優先隊列
總結
以上是生活随笔為你收集整理的openjudge 拯救行动的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。