概述
问题描述
小明在玩一个电脑游戏,游戏在一个
n×
m的方格图上进行,小明控制的角色开始的时候站在第一行第一列,目标是前往第
n行第
m列。
方格图上有一些方格是始终安全的,有一些在一段时间是危险的,如果小明控制的角色到达一个方格的时候方格是危险的,则小明输掉了游戏,如果小明的角色到达了第 n行第 m列,则小明过关。第一行第一列和第 n行第 m列永远都是安全的。
每个单位时间,小明的角色必须向上下左右四个方向相邻的方格中的一个移动一格。
经过很多次尝试,小明掌握了方格图的安全和危险的规律:每一个方格出现危险的时间一定是连续的。并且,小明还掌握了每个方格在哪段时间是危险的。
现在,小明想知道,自己最快经过几个时间单位可以达到第 n行第 m列过关。
方格图上有一些方格是始终安全的,有一些在一段时间是危险的,如果小明控制的角色到达一个方格的时候方格是危险的,则小明输掉了游戏,如果小明的角色到达了第 n行第 m列,则小明过关。第一行第一列和第 n行第 m列永远都是安全的。
每个单位时间,小明的角色必须向上下左右四个方向相邻的方格中的一个移动一格。
经过很多次尝试,小明掌握了方格图的安全和危险的规律:每一个方格出现危险的时间一定是连续的。并且,小明还掌握了每个方格在哪段时间是危险的。
现在,小明想知道,自己最快经过几个时间单位可以达到第 n行第 m列过关。
输入格式
输入的第一行包含三个整数
n,
m,
t,用一个空格分隔,表示方格图的行数
n、列数
m,以及方格图中有危险的方格数量。
接下来 t行,每行4个整数 r, c, a, b,表示第 r行第 c列的方格在第 a个时刻到第 b个时刻之间是危险的,包括 a和 b。游戏开始时的时刻为0。输入数据保证 r和 c不同时为1,而且当 r为 n时 c不为 m。一个方格只有一段时间是危险的(或者说不会出现两行拥有相同的 r和 c)。
接下来 t行,每行4个整数 r, c, a, b,表示第 r行第 c列的方格在第 a个时刻到第 b个时刻之间是危险的,包括 a和 b。游戏开始时的时刻为0。输入数据保证 r和 c不同时为1,而且当 r为 n时 c不为 m。一个方格只有一段时间是危险的(或者说不会出现两行拥有相同的 r和 c)。
输出格式
输出一个整数,表示小明最快经过几个时间单位可以过关。输入数据保证小明一定可以过关。
样例输入
3 3 3
2 1 1 1
1 3 2 10
2 2 2 10
2 1 1 1
1 3 2 10
2 2 2 10
样例输出
6
样例说明
第2行第1列时刻1是危险的,因此第一步必须走到第1行第2列。
第二步可以走到第1行第1列,第三步走到第2行第1列,后面经过第3行第1列、第3行第2列到达第3行第3列。
第二步可以走到第1行第1列,第三步走到第2行第1列,后面经过第3行第1列、第3行第2列到达第3行第3列。
评测用例规模与约定
前30%的评测用例满足:0 <
n,
m ≤ 10,0 ≤
t < 99。
所有评测用例满足:0 < n, m ≤ 100,0 ≤ t < 9999,1 ≤ r ≤ n,1 ≤ c ≤ m,0 ≤ a ≤ b ≤ 100。
这道题首先想到用BFS,但是普通的BFS中的点只能够走一次,这道题点在危险时间之内不能走,所以会出现重复走的情况。如果不加以限制,可能陷入死循环。所以增加一个维度时间,visit[x][y][t],表示在t时间点是否走过,若走过,则不加入队列。
#include<iostream>
#include<queue>
using namespace std;
#define maxn 105
#define INF 1<<29
struct node {
int x, y, t;
};//记录每个点当前的坐标和时间
struct tnode {
int a=0, b=0;
};
int dir[4][2] = { {-1,0},{1,0},{0,1},{0,-1 } };
tnode map[maxn][maxn];
bool visit[102][102][305] = { 0 };//100之后全部点都可以用
int bfs(int n,int m)
{
node start,temp1,temp2;
start.x = 1; start.y = 1; start.t = 0;
queue<node> Q;
Q.push(start);
while (Q.size())
{
temp1 = Q.front();
Q.pop();
if (temp1.x == n&&temp1.y == m)
return temp1.t;
for (int i = 0; i < 4; i++)
{
temp2.x = temp1.x + dir[i][0];//表示相邻点
temp2.y = temp1.y + dir[i][1];
temp2.t = temp1.t + 1;
if (!visit[temp2.x][temp2.y][temp2.t]&&temp2.x >= 1 && temp2.x <= n&&temp2.y >= 1 && temp2.y <= m&&(temp2.t<map[temp2.x][temp2.y].a|| temp2.t>map[temp2.x][temp2.y].b))
{
Q.push(temp2);
visit[temp2.x][temp2.y][temp2.t] = 1;
}
}
}
}
int main()
{
int n, m, t;
int r, c, a, b;
cin >> n >> m >> t;
for (int i = 0; i < t; i++)
{
cin >> r >> c >> a >> b;
map[r][c].a = a;
map[r][c].b = b;
}
cout<<bfs(n, m);
system("pause");
return 0;
}
最后
以上就是生动乌龟为你收集整理的CCF 201604-04 游戏 BFS+时间限制的全部内容,希望文章能够帮你解决CCF 201604-04 游戏 BFS+时间限制所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复