zoukankan      html  css  js  c++  java
  • I’m stuck!(BFS)

                                                    I’m stuck!

    给定一个R行C列的地图,地图的每一个方格可能是'#', '+', '-', '|', '.', 'S', 'T'七个字符中的一个,分别表示如下意思:

    '#': 任何时候玩家都不能移动到此方格;

    '+': 当玩家到达这一方格后,下一步可以向上下左右四个方向相邻的任意一个非'#'方格移动一格;

    '-': 当玩家到达这一方格后,下一步可以向左右两个方向相邻的一个非'#'方格移动一格;

    '|': 当玩家到达这一方格后,下一步可以向上下两个方向相邻的一个非'#'方格移动一格;

    '.': 当玩家到达这一方格后,下一步只能向下移动一格。如果下面相邻的方格为'#',则玩家不能再移动;

    'S': 玩家的初始位置,地图中只会有一个初始位置。玩家到达这一方格后,下一步可以向上下左右四个方向相邻的任意一个非'#'方格移动一格;

    'T': 玩家的目标位置,地图中只会有一个目标位置。玩家到达这一方格后,可以选择完成任务,也可以选择不完成任务继续移动。如果继续移动下一步可以向上下左右四个方向相邻的任意一个非'#'方格移动一格。

    此外,玩家不能移动出地图。

    请找出满足下面两个性质的方格个数:

    1. 玩家可以从初始位置移动到此方格;

    2. 玩家可以从此方格移动到目标位置。

    输入格式

    输入的第一行包括两个整数R 和C,分别表示地图的行和列数。(1 ≤ R, C ≤ 50)。

    接下来的R行每行都包含C个字符。它们表示地图的格子。地图上恰好有一个'S'和一个'T'。

    输出格式
    如果玩家在初始位置就已经不能到达终点了,就输出“I'm stuck!”(不含双引号)。否则的话,输出满足性质的方格的个数。
    样例输入

    5 5

    --+-+

    ..|#.

    ..|##

    S-+-T

    ####.

    样例输出
    2
    样例说明

    如果把满足性质的方格在地图上用'X'标记出来的话,地图如下所示:

    --+-+

    ..|#X

    ..|##

    S-+-T

    ####X

    #include <iostream>
    #include <cstring>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <cmath>
    #include <time.h>
    #include <string>
    #include <map>
    #include <stack>
    #include <vector>
    #include <set>
    #include <queue>
    #define inf 0x3f3f3f3f
    #define mod 10000
    typedef long long ll;
    using namespace std;
    const int N=55;
    const int M=300005;
    int power(int a,int b,int c){int ans=1;while(b){if(b%2==1){ans=(ans*a)%c;b--;}b/=2;a=a*a%c;}return ans;}
    int vis[N][N];
    char w[N][N];
    int a[N][N];
    int d[4][2]={-1,0,1,0,0,-1,0,1};
    int n,m,sx,sy,ans=0;
    bool flag=false;
    struct man
    {
        int x,y;
    };
    void bfs(int x,int y,int num)
    {
        memset(vis,0,sizeof(vis));
        queue<man>q;
        while(!q.empty())q.pop();
        man s;s.x=x;s.y=y;
        q.push(s);
        a[x][y]=1;
        vis[x][y]=1;
        while(!q.empty()){
            man t=q.front();q.pop();
            if(w[t.x][t.y]=='+'||w[t.x][t.y]=='S'||w[t.x][t.y]=='T'){
                if(w[t.x][t.y]=='T'){flag=true;if(num==2)break;}
                for(int i=0;i<4;i++){
                    int xx=t.x+d[i][0],yy=t.y+d[i][1];
                    if(xx>=0&&xx<n&&yy>=0&&yy<m&&w[xx][yy]!='#'){
                       if((num==1&&a[xx][yy]==0)||(num==2&&vis[xx][yy]==0)) {man k;k.x=xx,k.y=yy;q.push(k);
                        if(num==1) a[xx][yy]=1;
                        else vis[xx][yy]=1;}
                    }
                }
            }
            else if(w[t.x][t.y]=='-'){
                for(int i=2;i<4;i++){
                    int xx=t.x+d[i][0],yy=t.y+d[i][1];
                    if(xx>=0&&xx<n&&yy>=0&&yy<m&&w[xx][yy]!='#'){
                        if((num==1&&a[xx][yy]==0)||(num==2&&vis[xx][yy]==0)) {man k;k.x=xx,k.y=yy;q.push(k);
                        if(num==1) a[xx][yy]=1;
                        else vis[xx][yy]=1;}
                    }
                }
            }
            else if(w[t.x][t.y]=='|'){
                for(int i=0;i<2;i++){
                    int xx=t.x+d[i][0],yy=t.y+d[i][1];
                    if(xx>=0&&xx<n&&yy>=0&&yy<m&&w[xx][yy]!='#'){
                        if((num==1&&a[xx][yy]==0)||(num==2&&vis[xx][yy]==0)) {man k;k.x=xx,k.y=yy;q.push(k);
                        if(num==1) a[xx][yy]=1;
                        else vis[xx][yy]=1;}
                    }
                }
            }
            else if(w[t.x][t.y]=='.'){
                for(int i=1;i<2;i++){
                    int xx=t.x+d[i][0],yy=t.y+d[i][1];
                    if(xx>=0&&xx<n&&yy>=0&&yy<m&&w[xx][yy]!='#'){
                        if((num==1&&a[xx][yy]==0)||(num==2&&vis[xx][yy]==0)) {man k;k.x=xx,k.y=yy;q.push(k);
                        if(num==1) a[xx][yy]=1;
                        else vis[xx][yy]=1;}
                    }
                }
            }
        }
    }
    int main()
    {
        memset(a,0,sizeof(a));
        scanf("%d%d",&n,&m);
        for(int i=0;i<n;i++)scanf("%s",w[i]);
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                if(w[i][j]=='S')sx=i,sy=j;
            }
        }
        bfs(sx,sy,1);
        if(!flag){puts("I'm stuck!");exit(0);}
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                if(a[i][j]){
                    flag=false;
                    bfs(i,j,2);
                    if(!flag)ans++;
                }
    
            }
        }
        cout<<ans<<endl;
        return 0;
    }
    View Code
  • 相关阅读:
    java基于redis事务的秒杀实现
    redis事务
    java 根据经纬度坐标计算两点的距离算法
    Spring ElasticsearchTemplate 经纬度按距离排序
    springboot springmvc拦截器 拦截POST、PUT、DELETE请求参数和响应数据,并记录操作日志
    jpa Auditor 自动赋值与自定义 @CreatedBy @LastModifiedBy @CreatedDate @LastModifiedDate
    docker安装elasticsearch
    win10中使用 Windows照片查看器
    Springboot 项目启动后执行某些自定义代码
    SimpleDateFormat 线程不安全及解决方案
  • 原文地址:https://www.cnblogs.com/jianrenfang/p/5829404.html
Copyright © 2011-2022 走看看