2018年长沙理工大学第十三届程序设计竞赛 G 题:逃离迷宫
题目链接:https://www.nowcoder.com/acm/contest/96/G
思路:两遍bfs,找到p到k的情况,记录时间;找到E到k的情况,记录时间。题目超时点在于输入需要用scanf。如果不用scanf可以用cin加速挂。
AC代码:
1 #include<iostream>
2 #include<bits/stdc++.h>
3 #include<queue>
4 #define INF 10000000
5 using namespace std;
6 int vis[505][505];
7 int ans[505][505];
8 char a[505][505];
9 int fx[4][2]={{-1,0},{0,-1},{1,0},{0,1}};
10 struct Node{
11 int x,y,step;
12 };
13 void bfs(int x,int y){
14 queue < Node > q;
15 Node now,nxt;
16 now.x=x;
17 now.y=y;
18 now.step=0;
19 q.push(now);
20 vis[x][y]=1;
21 while(!q.empty()){
22 now=q.front();
23 q.pop();
24 if(a[now.x][now.y]=='K'){
25 ans[now.x][now.y]=now.step;
26 }
27 for(int i=0;i<4;i++){
28 int tmpx=now.x+fx[i][0];
29 int tmpy=now.y+fx[i][1];
30 if(!vis[tmpx][tmpy]&&a[tmpx][tmpy]!='#'){
31 nxt.x=tmpx;
32 nxt.y=tmpy;
33 vis[nxt.x][nxt.y]=1;
34 nxt.step=now.step+1;
35 q.push(nxt);
36 }
37 }
38 }
39 return ;
40 }
41 int BFS(int x,int y){
42 queue < Node > q;
43 int mini=INF;
44 Node now,nxt;
45 now.x=x;
46 now.y=y;
47 now.step=0;
48 q.push(now);
49 vis[x][y]=1;
50 while(!q.empty()){
51 now=q.front();
52 q.pop();
53 if(a[now.x][now.y]=='K'&&ans[now.x][now.y]){
54 mini=min(mini,ans[now.x][now.y]+now.step);
55 }
56 for(int i=0;i<4;i++){
57 int tmpx=now.x+fx[i][0];
58 int tmpy=now.y+fx[i][1];
59 if(!vis[tmpx][tmpy]&&a[tmpx][tmpy]!='E'&&a[tmpx][tmpy]!='#'){
60 nxt.x=tmpx;
61 nxt.y=tmpy;
62 nxt.step=now.step+1;
63 q.push(nxt);
64 vis[nxt.x][nxt.y]=1;
65 }
66 }
67 }
68 return mini;
69 }
70 int main(){
71 // ios::sync_with_stdio(false); 加速挂
72 int T;
73 cin>>T;
74 while(T--){
75 int n,m;
76 cin>>n>>m;
77 memset(ans,0,sizeof(ans));
78 for(int i=0;i<504;i++)
79 for(int j=0;j<504;j++)
80 a[i][j]='#';
81 for(int i=1;i<=n;i++){
82 char c=getchar();
83 for(int j=1;j<=m;j++){
84 scanf("%c",&a[i][j]);
85 }
86 }
87 for(int i=1;i<=n;i++){
88 for(int j=1;j<=m;j++){
89 if(a[i][j]=='E'){
90 memset(vis,0,sizeof(vis));
91 bfs(i,j);
92 break;
93 }
94 }
95 }
96 int mini;
97 for(int i=1;i<=n;i++){
98 for(int j=1;j<=m;j++){
99 if(a[i][j]=='P'){
100 memset(vis,0,sizeof(vis));
101 mini=BFS(i,j);
102 break;
103 }
104 }
105 }
106 if(mini==INF){
107 cout<<"No solution"<<endl;
108 }else{
109 cout<<mini<<endl;
110 }
111 }
112 return 0;
113 }