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 }        

 

posted @ 2018-04-20 10:20  ISGuXing  阅读(299)  评论(0编辑  收藏  举报