• 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 }        
  • 相关阅读:
    记账程序2.0
    安装redHat6.5详细图文教程
    redHat6设置ip地址
    如何开通B站的直播空间
    python实战技巧之两个字典,如何实现键同则值相加【不等长或等长】
    python实战技巧之去除列表中的空值元素
    python实战技巧之两个不等长列表让里面的数字一一对应地相加
    python实战技巧之两个列表实例中,如何让里面的数字一一对应地相加【对于两个列表是等长的情况】
    java基础_网络编程
    java基础_String
  • 原文地址:https://www.cnblogs.com/ISGuXing/p/8888720.html
Copyright © 2020-2023  润新知