题意:
这道题蛮好的,以前做bfs基本上都是二维的。
这道题从题面上就能看出来是bfs,我们记录下每个有危险性的点和各自的起始时间和结束时间,然后直接套模板,答案是对的,但会超时。
以前,我们都是用一个数组来标记当前点是否能入队(队列中要保证不能有相同元素)。但这道题,可以从当前点出发,然后经过一系列移动再回来,所以不能直接用二维数组来标记,但是我们发现,再次回来的时候时间是不同的,所以我们可以根据这个性质来设计一个三维数组来标记当前点。
代码:
#include<stdio.h>
#include<iostream>
#include<map>
#include<string.h>
#include<queue>
using namespace std;
typedef pair<int,int>Pa;
int ma[105][105];
int flag[105][105];
int dis[4][2]= {{1,0},{-1,0},{0,1},{0,-1}};
int vis[105][105][105];
map<Pa,int>M1,M2;
int n,m,t;
struct Node
{
int x;
int y;
int num;
Node(int xx,int yy,int numm)
{
x=xx;
y=yy;
num=numm;
}
};
int bfs()
{
queue<Node>Q;
Q.push(Node(1,1,0));
vis[1][1][0]=1;
while(!Q.empty())
{cout<<"++"<<endl;
Node top=Q.front();
Q.pop();
if(top.x==n&&top.y==m)
return top.num;
int nx,ny;
for(int i=0; i<4; i++)
{
nx=top.x+dis[i][1];
ny=top.y+dis[i][0];
if(nx>=1&&nx<=n&&ny>=1&&ny<=m&&!vis[nx][ny][top.num+1])
{
if(!M1[make_pair(nx,ny)]&&!M2[make_pair(nx,ny)])
{
Q.push(Node(nx,ny,top.num+1));
vis[nx][ny][top.num+1]=1;
}
else if(top.num+1<M1[make_pair(nx,ny)]||top.num+1>M2[make_pair(nx,ny)])
{
Q.push(Node(nx,ny,top.num+1));
vis[nx][ny][top.num+1]=1;
}
}
}
}
}
int main()
{
scanf("%d%d%d",&n,&m,&t);
int a,b,c,d;
for(int i=0; i<t; i++)
{
scanf("%d%d%d%d",&a,&b,&c,&d);
M1[make_pair(a,b)]=c;
M2[make_pair(a,b)]=d;
}
int ans=bfs();
printf("%d\n",ans);
}