返回顶部

哈尔滨理工大学软件与微电子学院程序设计竞赛(同步赛) C.Coronavirus (BFS)

  • 题意:有一个图,要求从\(S\)走到\(E\),\(.\)表示可以走的路径,\(*\)周围的八个方向均不能走,要求判断是否能走到\(E\),若能,输出最小路径长度,否则输出\(Impossible\).

  • 题解:我们先把\(*\)周围的点标记一下,然后判断\(E\)是否被标记过了,如果没有,则找到\(S\)的位置进行BFS,结构体\(s\)记录坐标和路径,每次判断一下,然后再把点入队搞搞就好了.

    其实就是BFS的板子题.

  • 代码:

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <cmath>
    #include <algorithm>
    #include <stack>
    #include <queue>
    #include <vector>
    #include <map>
    #include <set>
    #include <unordered_set>
    #include <unordered_map>
    #define ll long long
    #define fi first
    #define se second
    #define pb push_back
    #define me memset
    const int N = 1e6 + 10;
    const int mod = 1e9 + 7;
    const int INF = 0x3f3f3f3f;
    using namespace std;
    typedef pair<int,int> PII;
    typedef pair<ll,ll> PLL;
     
    int n,m;
    int ans;
    char a[100][100];
    bool vis[100][100];
    int dx[4]={-1,0,1,0},dy[4]={0,1,0,-1};
     
    struct s{
        int x,y,cnt;
    }p;
     
     
    bool bfs(int x,int y){
        queue<s> q;
        vis[x][y]=true;
        p.x=x,p.y=y,p.cnt=0;
        q.push(p);
         while(!q.empty()){
            s tmp=q.front();
            q.pop();
            if(a[tmp.x][tmp.y]=='E'){
                ans=tmp.cnt;
                return true;
            }
            for(int i=0;i<4;++i){
                int tx=tmp.x+dx[i];
                int ty=tmp.y+dy[i];
                if((a[tx][ty]=='.'||a[tx][ty]=='E') && !vis[tx][ty]){
                    vis[tx][ty]=true;
                    p.x=tx,p.y=ty,p.cnt=tmp.cnt+1;
                    q.push(p);
                }
            }
         }
        return false;
    }
     
    int main() {
        ios::sync_with_stdio(false);cin.tie(0);
        cin>>n>>m;
         for(int i=1;i<=n;++i){
            for(int j=1;j<=m;++j){
                cin>>a[i][j];
            }
         }
         for(int i=1;i<=n;++i){
            for(int j=1;j<=m;++j){
                if(a[i][j]=='*'){
                    if(a[i+1][j]!='*') a[i+1][j]=-1;
                    if(a[i+1][j+1]!='*') a[i+1][j+1]=-1;
                    if(a[i][j+1]!='*') a[i][j+1]=-1;
                    if(a[i-1][j+1]!='*') a[i-1][j+1]=-1;
                    if(a[i-1][j]!='*') a[i-1][j]=-1;
                    if(a[i-1][j-1]!='*') a[i-1][j-1]=-1;
                    if(a[i][j-1]!='*') a[i][-1]=-1;
                    if(a[i+1][j-1]!='*') a[i+1][j-1]=-1;
                }
            }
         }
         bool ok=0;
         for(int i=1;i<=n;++i){
            for(int j=1;j<=m;++j){
                if(a[i][j]=='E'){
                    ok=1;
                }
            }
         }
         if(!ok){
            cout<<"Impossible"<<endl;
            return 0;
         }
         for(int i=1;i<=n;++i){
            for(int j=1;j<=m;++j){
                if(a[i][j]=='S'){
                    ok=bfs(i,j);
                }
            }
         }
         if(ok) cout<<ans<<endl;
         else cout<<"Impossible"<<endl;
     
        return 0;
    }
    
posted @ 2020-06-15 20:32  Rayotaku  阅读(267)  评论(0编辑  收藏  举报