求最短时间,用BFS,timee数组表示每个格子落下流星 的最短时间,因为她要在流星落下前就跑出去
for(int i = 0; i< 305; i++)
{
for(int j = 0; j < 305; j++)
{
book[i][j] = 0;
timee[i][j] = inf;
}
}
for(int i = 0; i < m; i++)
{
cin >> x >> y >> t;
if(t < timee[x][y])
t = timee[x][y];
for(int j = 0; j < 4; j++)
{
int a = x + xx[j];
int b = y + yy[j];
if(a < 0 || b < 0)
continue;
if(t < timee[a][b])
timee[a][b] = t;
}
}
BFS:枚举每一个方向,如果下一个格子没有越界,而且她可以在流星落下前跑出去,那么再从这个格子开始枚举,直到跑到一个没有流星落下的格子,即timee等于inf的格子
void bfs()
{
q.push(s1);
while(!q.empty())
{
s1 = q.front();
q.pop();
for(int i = 0; i < 4; i++)
{
int a = s1.x + xx[i], b = s1.y + yy[i];
if(a >= 0 && b >= 0 && !book[a][b] && s1.t + 1 < timee[a][b])
{
s2.x = a;
s2.y = b;
s2.t = s1.t + 1;
book[a][b] = 1;
q.push(s2);
if(timee[a][b] == inf)
{
cout << s2.t;
return;
}
}
}
}
cout << -1;
return;
}
完整代码
#include <bits/stdc++.h>
using namespace std;
const int inf = 0x3f3f3f3f;
int xx[4] = {-1, 1, 0, 0};
int yy[4] = {0, 0, -1, 1};
int timee[305][305], book[305][305], m, x, y, t;
struct s
{
int x;
int y;
int t;
};
s s1;
s s2;
queue <s> q;
void bfs()
{
q.push(s1);
while(!q.empty())
{
s1 = q.front();
q.pop();
for(int i = 0; i < 4; i++)
{
int a = s1.x + xx[i], b = s1.y + yy[i];
if(a >= 0 && b >= 0 && !book[a][b] && s1.t + 1 < timee[a][b])
{
s2.x = a;
s2.y = b;
s2.t = s1.t + 1;
book[a][b] = 1;
q.push(s2);
if(timee[a][b] == inf)
{
cout << s2.t;
return;
}
}
}
}
cout << -1;
return;
}
int main(void)
{
cin >> m;
for(int i = 0; i< 305; i++)
{
for(int j = 0; j < 305; j++)
{
book[i][j] = 0;
timee[i][j] = inf;
}
}
for(int i = 0; i < m; i++)
{
cin >> x >> y >> t;
if(t < timee[x][y])
t = timee[x][y];
for(int j = 0; j < 4; j++)
{
int a = x + xx[j];
int b = y + yy[j];
if(a < 0 || b < 0)
continue;
if(t < timee[a][b])
timee[a][b] = t;
}
}
book[0][0] = 1;
s1.x = 0;
s1.y = 0;
s1.t = 0;
bfs();
return 0;
}