一、题目
二、解题
1.题目
类似于迷宫问题,假设有一个n行m列的矩阵,其中的一些格子是障碍物,机器人从(1,1)出发,每次可以向上、下、左、右移动一个格子,但是不能移动到障碍物的格子上。在地图上有t个区间类障碍,表示在这个时间范围内,某个位置是不能通过的。问机器人从起点到终点最少需要多少步,如果无法到达,则输出0。
具体思路如下:
-
首先定义一个Node结构体,表示二维矩阵上的一个点,该结构体包含三个变量,分别是该点的横纵坐标和出发到该点的步数(即时间)。
-
定义一个Direct结构体,表示四个方向上的偏移量,即向左、向右、向上、向下移动的时候横纵坐标分别需要增加或减少多少。
-
定义一个visited数组,表示当前时刻机器人走到某个位置是否合法。数组的下标为三维,前两维表示横纵坐标,第三维表示时间。
-
定义一个队列p,将起点放入队列中。
-
从队列中取出一个Node作为当前位置,对该点的四个方向进行搜索,每次向某个方向移动一步,并更新其坐标和出发时间,将其加入队列p中。
-
搜索时需要判断一些边界条件,比如是否越界、是否为障碍,以及该点在该时间是否已被访问。
-
如果搜索到终点,则返回该点的出发时间,否则返回0表示无法到达。
-
在主函数中,输入n、m、t以及t个区间类障碍,遍历障碍范围,并在visited数组中标记为不能通行。
-
调用bfs函数,返回最短路程的时间,输出即可。
总之,该代码使用宽度优先搜索(BFS)算法实现了迷宫问题的求解,具体思路比较清晰,算法思想简单易懂。
2.代码
dev c++ 5.11
#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
const int N=105;
int visited[N][N][305];
struct Node{
int x,y,time;
};
queue<Node> q;
struct Dir{
int x,y;
}d[4]={{-1,0},{0,1},{1,0},{0,-1}};
int bfs(int n,int m){
Node s,node,temp;
s.x=1;
s.y=1;
s.time=0;
q.push(s);
while(!q.empty()){
node=q.front();
q.pop();
if(node.x==n && node.y==m)
return node.time;
for(int i=0;i<4;i++){
temp.x=node.x+d[i].x;
temp.y=node.y+d[i].y;
temp.time=node.time+1;
if(visited[temp.x][temp.y][temp.time]) continue;
if(temp.x<1 ||temp.x>n || temp.y<1 || temp.y>m) continue;
visited[temp.x][temp.y][temp.time]=1;
q.push(temp);
}
}
return 0;
}
int main(){
int n,m,t,r,c,a,b;
cin>>n>>m>>t;
memset(visited,0,sizeof(visited));
for(int i=0;i<t;i++){
cin>>r>>c>>a>>b;
for(int j=a;j<=b;j++){
visited[r][c][j]=1;
}
}
int ans=bfs(n,m);
cout<<ans<<endl;
return 0;
}
3.提交结果
总结
1.注意边界
if(visited[temp.x][temp.y][temp.time]) continue;
if(temp.x<1 ||temp.x>n || temp.y<1 || temp.y>m) continue;