题意:
这道题蛮好的,以前做bfs基本上都是二维的。
这道题从题面上就能看出来是bfs,我们记录下每个有危险性的点和各自的起始时间和结束时间,然后直接套模板,答案是对的,但会超时。
以前,我们都是用一个数组来标记当前点是否能入队(队列中要保证不能有相同元素)。但这道题,可以从当前点出发,然后经过一系列移动再回来,所以不能直接用二维数组来标记,但是我们发现,再次回来的时候时间是不同的,所以我们可以根据这个性质来设计一个三维数组来标记当前点。http://www.sn180.com/buyer/buyview/1115842824.html
代码:
-
#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]; http://www.sn180.com/buyer/buyview/1115893568.html
-
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);
-
}