题意:
有个人去看流星雨,不料流星掉下来会砸毁上下左右中五个点。每个流星掉下的位置和时间都不同,人不能待在流星毁过的地方,人从0,0出发,每次人只能走上下左右中一步,求他是否能求小文青能否到安全的地方,如果能,最短的逃跑时间是多少?
题解:
1.对地图初始化,流星破坏的地方设置成他的下落时间,其他地方设置成INF
2.struct里面记录坐标和时间,每一次的上下左右移动需要判断出界和时间加+1,并且要记录是否来过,从而剪枝,如果走到了地方是INF,那么可以,否则输出-1。
注意:
1.这个题是地图初始化,从而得到成立条件。
2.visited[][]记录每个点是否到达,剪枝
3.结构体里面的参数设置
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<queue>
#define pr(x) cout<<#x<<" "<<x;
#define pl(x) cout<<#x<<" "<<x<<endl;
using namespace std;
int maze[305][305];
int dx[] = {0,0,-1,1};
int dy[] = {-1,1,0,0};
bool visited[305][305];
const int INF = 0x3f3f3f3f;
struct p{
int x,y,time;
};
int bfs(){
queue<p> que;
p np;
np.x=0;np.y=0;np.time=0;
que.push(np);
visited[0][0] = true;
if(maze[0][0]==INF){return 0;}
if(maze[0][0]==0){return -1;}
while(que.size()){
p cp = que.front();
que.pop();
for(int i = 0;i < 4;i++){
np = cp;
np.x = np.x + dx[i];
np.y = np.y + dy[i];
np.time = np.time+1;
if(np.time<maze[np.x][np.y]&&!visited[np.x][np.y]&&np.x>=0&&np.y>=0){
if(maze[np.x][np.y]==INF){return np.time;}
que.push(np);
visited[np.x][np.y] = true;
}
}
}
return -1;
}
int main(){
int n;
scanf("%d",&n);
int a,b,t;
for(int i = 0;i<305;i++){
for(int j = 0;j<305;j++){
maze[i][j] = INF;
visited[i][j] = false;
}
}
while(n--){
scanf("%d %d %d",&a,&b,&t);
maze[a][b] = min(maze[a][b],t);
for(int j = 0; j<4 ;j++){
if((a+dx[j])>=0&&(b+dy[j])>=0)
{
maze[a+dx[j]][b+dy[j]] = min(maze[a+dx[j]][b+dy[j]],t);
}
}
}
int ans = bfs();
printf("%d\n",ans);
}