杭电1072 结构体广搜

题目的意思是:给你一个迷宫,0代表墙,1代表路,2代表起始位置,3代表终点,4代表爆破装置。一开始,你在2的位置,求到3的最少步数。

4虽然为爆破装置 ,可以连续爆破,但是如果连续爆破时间虽然拓展了,但是却肯定不是最短时间了。

起初,你只有6秒钟的时间,时间减到0,你没到3的位置,代表不能出去,输出-1.想要增加时间,可以引爆爆破装置,引爆之后,时间重置为6,可以引爆多个。到引爆装置的时候,时间必须大于0,不然没有时间可以引爆。

迷宫最大是8 * 8。用广度优先搜索可以简单的


#include<iostream>

#include<cstdio>
#include<string.h>
#include<queue>
#include<algorithm>
using namespace std;


typedef struct
{
    int etime;  //时间    

    int x,y;        //坐标    

    int cnt;   //已经用去的时间
}data;
int n,m,sx,sy;
int mapp[9][9];
int dir[4][2]= {1,0,-1,0,0,1,0,-1};
int bfs()
{
    int i ;
    int tx,ty;
    queue<data>que;
    while(!que.empty())
        que.pop();
    data da,temp;
    da.x = sx;
    da.y = sy;
    da.etime = 6;
    da.cnt = 0;
    que.push(da);
    while(!que.empty())
    {
        temp = que.front();
        que.pop();
        if(mapp[temp.x][temp.y]==3)
            return temp.cnt;
        if(temp.etime==1)continue;//时间为1时一定失败
        for(i = 0;i<4;i++)
        {
            tx= temp.x+dir[i][0];
            ty = temp.y+dir[i][1];
            if(tx<0||tx>=n||ty<0||ty>=m||mapp[tx][ty]==0)//判断
                continue;
            da.x = tx;
            da.y = ty;
            da.etime =temp.etime-1 ;
            da.cnt=temp.cnt+1;
            if(mapp[tx][ty]==4)
            {
                da.etime = 6;
                mapp[tx][ty] = 0;
            }
            que.push(da);
        }
    }
    return -1;
}




int main()
{
    int t,i,j;
    while(scanf("%d",&t)!=EOF)
    {
        while(t--)
        {
            memset(mapp,0,sizeof(mapp));//初始化
            scanf("%d%d",&n,&m);
            for(i = 0; i <n;i++)
            {
                for( j = 0; j<m;j++)
                {
                    scanf("%d",&mapp[i][j]);
                    if(mapp[i][j] == 2)
                    {
                        sx = i;
                        sy = j;
                    }
                }
            }
            int ans = bfs();
            cout<<ans<<endl;
        }
    }
    return 0;
}





























  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值