题目大意:
该题为走迷宫,其条件有如下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;
}