题目
题解
直接bfs,状态由r
,c
,time
,既然有三维状态,那就需要有三维标记,这样可以防止重复搜索。
代码
#include <bits/stdc++.h>
using namespace std;
#define FOR0(a,b) for(int i = a; i < b; ++i)
#define FORE(a,b) for(int i = a; i <= b; ++i)
typedef long long ll;
typedef pair<int,int> pii;
#define x first
#define y second
const int dr[] = {1,-1,0,0};
const int dc[] = {0,0,1,-1};
const int maxn = 1e4+5;
const int INF = 0x3f3f3f3f;
int n,m,t;
pii cor[105][105];
struct Node {
int r,c;
int tim;
};
int vis[105][105][300];
void solve() {
int ans = INF;
queue<Node> que;
que.push((Node){1,1,0});
memset(vis, 0,sizeof vis);
while(!que.empty()) {
Node u = que.front();
que.pop();
// cout << u.r <<" " << u.c<<" "<<u.tim << endl;
if(vis[u.r][u.c][u.tim])
continue;
// cout << -1 << endl;
vis[u.r][u.c][u.tim] = 1;
if(u.r == n && u.c == m) {
cout << u.tim << endl;
return;
}
for(int i = 0; i < 4; ++i) {
int nr = u.r+dr[i], nc = u.c+dc[i];
int ntim = u.tim+1;
if(nr < 1 || nr > n || nc < 1 || nc > m || ntim >= cor[nr][nc].x && ntim <= cor[nr][nc].y) continue;
que.push((Node){nr,nc,ntim});
}
// que.push((Node){u.r,u.c,u.tim+1});
}
}
int main() {
scanf("%d%d%d", &n, &m,&t);
int u,v,l,r;
for(int i = 0; i < t; ++i) {
scanf("%d%d%d%d", &u, &v, &l, &r);
cor[u][v].x = l; cor[u][v].y = r;
}
solve();
return 0;
}