zoukankan      html  css  js  c++  java
  • hdu 1072 Nightmare BFS搜索(可重走)

    二维图:
    0:墙
    1:路
    2:起点
    3:终点
    4:可重设炸弹定时器的地方,时间又重设为6。
    要在6个单位时间内从起点走到终点,不过当走到“ 4”时时间又可设为6;输出可行的最短步数。

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

  • 相关阅读:
    简例 一次执行多条mysql insert语句
    javax/javaee-api/ Maven依赖
    关闭页面前提示或保存数据
    SpringMVC的controller方法上若需要参数 如User
    方正飞越 A600硬改BIOS激活win7的工具与方法。
    Win7下IE11点击无反应的解决方法
    WinXP局域网共享设置
    使用VHD,让Win XP和 Win2003 运行在内存中
    dd if=/dev/zero of=的含义是什么?Linux 下的dd命令使用详解
    win8.1点击“更改电脑设置”无反应(闪退)
  • 原文地址:https://www.cnblogs.com/zxj015/p/2740267.html
Copyright © 2011-2022 走看看