zoukankan      html  css  js  c++  java
  • HDU1728 逃离迷宫

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

    每次走一个方向就一直走到底,路径上如果没访问过的点,就入队。因为是bfs,每次转向数只增加1,所以最先访问,就是转向数最少的。入队点如果再直走或者后退,那都是会访问已经访问的点,是没意义的,所以必会转向,所以转向数是+1的。

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <limits.h>
    #include <malloc.h>
    #include <ctype.h>
    #include <math.h>
    #include <string>
    #include <iostream>
    #include <algorithm>
    using namespace std;
    #include <stack>
    #include <queue>
    #include <vector>
    #include <deque>
    #include <set>
    #include <map>
    #define INF 999999999
    #define eps 0.00001
    #define LL __int64
    #define pi acos(-1.0)
      
    struct point
    {
        int x,y;
        int step;//记录转弯数。
    };
    int vis[110][110];
    int n,m;
    int dir[4][2]={
        1,0,
        -1,0,
        0,1,
        0,-1
    };
    
    char mp[110][110];
    int ok(point nw)
    {
        if(nw.x>=0&&nw.x<n&&nw.y>=0&&nw.y<m&&mp[nw.x][nw.y]=='.')
            return 1;
        return 0;
    }
    int sx,sy,ex,ey;
    
    int bfs()
    {
        memset(vis,0,sizeof vis);
        point sta,nw,nex; 
        sta.x=sx;
        sta.y=sy;
        sta.step=-1;//第一次不算转弯
        queue<point>q;
        q.push(sta);
        while(!q.empty())
        {
            nw=q.front();
            if(nw.x==ex&&nw.y==ey)
                return max(0,nw.step);
            q.pop(); 
            for(int i=0;i<4;i++)
            {
                nex=nw;
                nex.x+=dir[i][0];
                nex.y+=dir[i][1];
                nex.step=nw.step+1;//因为是走到了尽头了,所以每一次
                //每次step只加1,所以可以用bool vis
                while(ok(nex))
                { 
                    if(vis[nex.x][nex.y]==0)
                    {
                        q.push(nex);
                        vis[nex.x][nex.y]=1;//停在这个点。
                    }  
                    nex.x+=dir[i][0];
                    nex.y+=dir[i][1]; 
                }  
            }
        }
        return 999999;
    }
    int main()
    {
        int t;
        scanf("%d",&t);
        while(t--)
        {
            scanf("%d%d",&n,&m);
            for(int i=0;i<n;i++)
                scanf("%s",mp[i]);
            int k;
            scanf("%d%d%d%d%d",&k,&sy,&sx,&ey,&ex);
            sy--,sx--,ey--,ex--; 
            int ans=bfs();
            if(k>=ans)
                printf("yes
    ");
            else
                printf("no
    ");
        }
        return 0;
    }
  • 相关阅读:
    C# 获得 当年1月1号
    Mybatis快速入门
    maven项目无法读取src/main/java目录下的配置文件解决方法
    Jenkins之手动安装
    Ubuntu17安装maven3.5.2
    Ubuntu17安装Jenkins
    Spring之事务操作(注解)
    Spring之事务操作(配置文件)
    Spring之配置文件中引入其它配置文件
    【转】maven常用插件介绍
  • 原文地址:https://www.cnblogs.com/YingZhixin/p/7121791.html
Copyright © 2011-2022 走看看