• 炸弹时间复位


    题目大意:

           该题为走迷宫,其条件有如下6个:

    1, 迷宫用二维数组来表示;

    2, 人走动时不能越界,不能在墙上走;

    3, 当走到出口时,若剩余时间恰好为0,则失败;

    4, 找到炸弹复位装置,若剩余时间恰好为0,则不能使用;

    5, 炸弹复位装置可以使用若干次;

    6, 只要走到复位装置所在位置,时间自动复置为6;

    其中,数组中,0表示墙,1表示通道,2表示初始位置,3表示出口,4表示炸弹复位装置;

    求走出迷宫所需要的最少步数,若不能在炸弹爆炸前走出来,输出-1.

    大概思路:

           迷宫问题是经典的BFS问题,首先获取初始位置,调用队列,使其入队,定义方向数组,分别用(0,-1)、(-1,0)、(0,1)、(1,0)表示下上左右四个方向,对当前位置的四个方向进行判定,若能走得通,则使其入队。

    没啥说的,非常经典的广度优先搜索

    至于为啥坐了一晚上没对,原因太尴尬

    努力改正这样的毛病吧

    这个东西,不细心真的不行

    #include<iostream>
    #include<stdio.h>
    #include<queue>
    #include<cstring>
    using namespace std;
    struct node
    {
    int x;
    int y;
    int step;
    int time;
    };
    queue<node>Q;
    int f[4][2]={0,-1,0,1,-1,0,1,0};
    int a[505][505];
    int m,n;
    int bfs(int x,int y)
    {
    node q={x,y,0,6};
    a[q.x][q.y]=0;
    Q.push(q);
    while(!Q.empty())
    {
    node e,w;
    e=Q.front();
    Q.pop();
    for(int i=0;i<4;i++)
    {
    w.x=e.x+f[i][0];
    w.y=e.y+f[i][1];
    w.time=e.time-1;
    w.step=e.step+1;
    if(w.x>=0&&w.y>=0&&w.x<m&&w.y<n&&a[w.x][w.y]!=0&&w.time>0)
    {
    if(a[w.x][w.y]==3)
    {
    return w.step;
    }
    if(a[w.x][w.y]==4)
    {
    w.time=6;
    }
    Q.push(w);
    a[w.x][w.y]=0;
    }
    }
    }
    return -1;
    }
    int main()
    {
    int T;
    scanf("%d",&T);
    while(T--)
    {

    scanf("%d%d",&m,&n);
    for(int i=0;i<m;i++)
    {
    for(int j=0;j<n;j++)
    {
    scanf("%d",&a[i][j]);
    }
    }
    for(int i=0;i<m;i++)
    {
    for(int j=0;j<n;j++)
    {
    if(a[i][j]==2)
    printf("%d ",bfs(i,j));
    }
    }
    while(!Q.empty())
    Q.pop();
    memset(a,0,sizeof(a));

    /*这个while和这个memset有必要说一下

    每次处理完一组数据之后都要把使用的东西初始化

    包括队列清空,数组归零,申请的空间要释放等等

    要养成良好的习惯*/
    }
    return 0;
    }

  • 相关阅读:
    步步为营 SharePoint 开发学习笔记系列总结
    Type 关键字解读
    C# 利用反射方便取得DbDataReader里的值
    WCF 开发学习笔记
    用状态模式实现状态机工作流
    步步为营UML建模系列总结
    策略模式实现支持多种类数据库的DBHelp
    步步为营 .NET 设计模式学习笔记系列总结
    BPEL 语言介绍和应用
    步步为营 .NET 代码重构学习笔记系列总结
  • 原文地址:https://www.cnblogs.com/tianxxl/p/6500733.html
Copyright © 2020-2023  润新知