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;
    }
                       
                       

  • 相关阅读:
    驱动程序细节和权衡
    交互
    查找UI元素
    Selenium-Webdriver API命令和操作-Get & Wait
    Selenium的webdriver
    openssl生成ssl证书
    tony_nginx_02_URL重写
    CPA
    消息队列产品比较
    元数据交换绑定的秘密
  • 原文地址:https://www.cnblogs.com/zxj015/p/2740249.html
Copyright © 2011-2022 走看看