题目描述
给你一个n*m的图,地图上'.'代表可以走的地方,而'#'代表陷阱不能走,
'P'代表人物位置,'K'代表钥匙,'E'代表出口。人物一个,钥匙有多个,
('K'的数量<=50)),出口一个,每个位置可以向(上,下,左,右)四个
方向走一格,花费一个单位时间,现在你需要花费最少的时间拿到钥匙
然后从迷宫的出口出去(若没有钥匙,则不能进入迷宫出口所在的格子)。
'P'代表人物位置,'K'代表钥匙,'E'代表出口。人物一个,钥匙有多个,
('K'的数量<=50)),出口一个,每个位置可以向(上,下,左,右)四个
方向走一格,花费一个单位时间,现在你需要花费最少的时间拿到钥匙
然后从迷宫的出口出去(若没有钥匙,则不能进入迷宫出口所在的格子)。
输入描述:
第一行一个整数T(T <= 50),代表数据的组数
接下来一行n,m(n<=500,m<=500),代表地图的行和列
接下来n行,每行一个长度为m的字符串,组成一个图。
输出描述:
如果可以出去,输出所花费的最少时间。
如果不能出去,输出一行"No solution"。
示例1
输入
复制3 5 5 ....P ##..E K#... ##... ..... 5 5 P.... ..... ..E.. ..... ....K 5 5 P#..E .#.#. .#.#. .#.#. ...#K
输出
复制No solution 12 No solution
1 #include <iostream> 2 #include <cstdio> 3 #include <cstdlib> 4 #include <cstring> 5 #include <iostream> 6 #include <algorithm> 7 #include <cmath> 8 #include <queue> 9 using namespace std; 10 #define pi acos(-1.0) 11 typedef long long ll; 12 const int N =500+100; 13 int n,m,T; 14 char s[N][N]; 15 int ex,ey; 16 int dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}}; 17 bool check(int x,int y){ 18 if(x>=0&&x<n&&y>=0&&y<m&&s[x][y]!='#')//A,B都是可以再次走的,说明找到钥匙后还可以在走回去 19 return true; 20 return false; 21 } 22 struct Node{ 23 int x,y,step,key; 24 Node(){} 25 Node (int x,int y,int step,int key):x(x),y(y),step(step),key(key){} 26 }ss; 27 int bfs(Node nod){ 28 queue<Node>Q; 29 Q.push(nod); 30 while(!Q.empty()){ 31 Node tmp = Q.front(); 32 Q.pop(); 33 if(tmp.x==ex&&tmp.y==ey&&tmp.key==1){ 34 return tmp.step; 35 } 36 for(int i=0;i<4;i++){ 37 int x=tmp.x+dir[i][0]; 38 int y=tmp.y+dir[i][1]; 39 if(check(x,y)){ 40 if(tmp.key==0){//找到钥匙前变为A 41 //没有A,避免重复。 42 if(s[x][y]=='E') continue;//好没有钥匙,continue 43 if(s[x][y]=='.') { 44 s[x][y]='A'; 45 Q.push(Node(x,y,tmp.step+1,0)); 46 } 47 if(s[x][y]=='K'){ 48 s[x][y]='B';//找到钥匙了,变为B 49 Q.push(Node(x,y,tmp.step+1,1)); 50 } 51 } 52 else{ 53 if(s[x][y]!='B'){//找到钥匙后变为B 54 s[x][y]='B'; 55 Q.push(Node(x,y,tmp.step+1,1)); 56 } 57 } 58 } 59 } 60 } 61 return -1; 62 } 63 int main() 64 { 65 scanf("%d",&T); 66 while(T--) 67 { 68 scanf("%d%d",&n,&m); 69 for(int i=0;i<n;i++) 70 { 71 for(int j=0;j<m;j++){ 72 cin>>s[i][j]; 73 if(s[i][j]=='P'){ 74 ss.x=i,ss.y=j,ss.step=0; 75 } 76 if(s[i][j]=='E'){ 77 ex=i,ey=j; 78 } 79 } 80 } 81 int ans=bfs(ss); 82 if(ans==-1){ 83 printf("No solution\n"); 84 } 85 else{ 86 printf("%d\n",ans); 87 } 88 } 89 return 0; 90 }