原文链接
原题链接
思路
很像19年蓝桥杯走迷宫的那个题目。给你一个n*m的迷宫,1表示不可访问,0表示可访问,需要你求出,从(1,1)到(n,m)所需要的最短时间。这个题目也是一样的,只是他的1,0状态是动态变化的而已,但是思路是相通的。我们只有记录当前时间点是否可以访问即可,因此就需要三维的数组了。
代码
#include <bits/stdc++.h>
using namespace std;
//当前的位置和时间
struct node{
int r,c,t;
node(int rr,int cc,int tt):r(rr),c(cc),t(tt){}
};
bool visited[105][105][305];//标记一个点(r,c)在t时刻是否可以访问
//false未访问,可以访问。true表示不可以访问
int n,m,t;
int dir[4][2] = {{-1,0},{1,0},{0,-1},{0,1}};
int main(){
scanf("%d%d%d",&n,&m,&t);
while(t--){
int r,c,a,b;
scanf("%d%d%d%d",&r,&c,&a,&b);
for(int i=a;i<=b;i++){
visited[r][c][i] = true;
}
}
queue<node> q;//用BFS
q.push(node{1,1,0});
visited[1][1][0] = true;//标
while(!q.empty()){
node v = q.front();
q.pop();
if(v.r == n && v.c == m){
//到达终点
printf("%d",v.t);
return 0;
}
for(int i=0;i<4;i++){
int tr = v.r+dir[i][0];
int tc = v.c+dir[i][1];
int time = v.t+1;
//不越界且可访问
if(tr>0&&tr<=n&&tc>0&&tc<=m&&!visited[tr][tc][time]){
q.push(node{tr,tc,time});
visited[tr][tc][time] = true;
}
}
}
return 0;
}