zoukankan      html  css  js  c++  java
  • hdu 2102 A计划 bsf搜索

    http://acm.hdu.edu.cn/showproblem.php?pid=2102

    本题又是一道BSF搜索求最短路,只是在遇到‘#’时空传输时要注意一下,如果‘#’所对应的另一个迷宫位置也是‘#’时是没有意思的。

    #include <iostream>
    #include <stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include <queue>
    #include <algorithm>
    using namespace std;
    char map[25][15];
    int T,co,ro;
    int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}},visited[25][15];
    struct coor
    {
        int x,y;
        int step;
    };
    queue<coor>que;
    bool judge(int x,int y,int flag)
    {
        if(x<0||y<0||y>=ro)
        return false;
        if(flag<co)
        {
            if(x>=co)
            return false;
        }
        else
        {
            if(x>=2*co||x<co)
            return false;
        }
        if(visited[x][y]||map[x][y]=='*')
        return false;
        return true;
    }
    bool bfs()
    {
        int i,x,y;
        coor in,out;
        memset(visited,0,sizeof(visited));
        while(!que.empty())
        que.pop();
        in.x=0;
        in.y=0;
        in.step=0;
        que.push(in);
        while(!que.empty())
        {
            out=que.front();
            que.pop();
            if(out.step>T)
            return false;
            if(map[out.x][out.y]=='P')
            {
                printf("YES\n");
                return true;
            }
            for(i=0;i<4;i++)
            {
                x=out.x+dir[i][0];
                y=out.y+dir[i][1];
                if(!judge(x,y,out.x))
                continue;
                visited[x][y]=1;
                in.x=x;
                in.y=y;
                if(map[x][y]=='#')
                {
                    if(x<co)
                    in.x=x+co;
                    else
                    in.x=x-co;
                    visited[x][y]=1;
                }
                in.step=out.step+1;
                que.push(in);
            }
        }
        return false;
    }
    int main()
    {
        int cas,i,j;
        scanf("%d",&cas);
        while(cas--)
        {
            scanf("%d%d%d",&co,&ro,&T);
            for(i=0;i<2*co;i++)
            scanf("%s",map[i]);
            for(i=0;i<co;i++)
            for(j=0;j<ro;j++)
            {
                if((map[i][j]=='#'&&map[i+co][j]=='#')||(map[i][j]=='#'&&map[i+co][j]=='*')||(map[i][j]=='*'&&map[i+co][j]=='#'))
                {
                    map[i][j]='*';
                    map[i+co][j]='*';
                }
            }
            if(!bfs())
            printf("NO\n");
        }
        return 0;
    }
                       
                       

  • 相关阅读:
    Decker ce版社区(个人、免费)版安装
    修改SA登录限制
    vue eslint配置
    win10 搭建FMS流媒体服务 nginx rtmp
    直播推流软件
    常用直播拉流地址
    vue 父组件异步给子组件传递参数
    go int、int32、int6、float64、float32、bool、interface{}、string类型转换
    go如何往数据库中插入null
    go项目中日志的打印
  • 原文地址:https://www.cnblogs.com/zxj015/p/2740249.html
Copyright © 2011-2022 走看看