欢迎访问我的CCF认证解题目录
题目描述
试题编号: | 201604-4 |
试题名称: | 游戏 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: | 问题描述 小明在玩一个电脑游戏,游戏在一个n×m的方格图上进行,小明控制的角色开始的时候站在第一行第一列,目标是前往第n行第m列。 输入格式 输入的第一行包含三个整数n, m, t,用一个空格分隔,表示方格图的行数n、列数m,以及方格图中有危险的方格数量。 输出格式 输出一个整数,表示小明最快经过几个时间单位可以过关。输入数据保证小明一定可以过关。 样例输入 3 3 3 样例输出 6 样例说明 第2行第1列时刻1是危险的,因此第一步必须走到第1行第2列。 评测用例规模与约定 前30%的评测用例满足:0 < n, m ≤ 10,0 ≤ t < 99。 |
思路过程
这道题是求最少单位时间,遇到最优解第一步应该想到的就是BFS,这也确实是BFS求解,不过这题有点特别,他是可以往回走的,这样标记也就需要一点改变,我们可以定义一个三维数组,分别表示坐标和时间,因为题目中的x,y范围最大为100,a,b范围最大也为100,那么最极端的情况下300秒也可以到达终点,定义[105][105][305]的boolean数组(个人习惯多出几个)。
JAVA代码
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));//使用BufferedReader读入速度会快些
String[] line = br.readLine().split(" ");
int n = Integer.parseInt(line[0]), m = Integer.parseInt(line[1]), t = Integer.parseInt(line[2]);
boolean[][][] inQueue = new boolean[105][105][305];//标记一个节点是否以访问
int[][] direction = {{-1,0}, {1,0}, {0,1}, {0,-1}};//移动方向
for ( int i = 0; i < t; i++ ) {//读入信息
line = br.readLine().split(" ");
int r = Integer.parseInt(line[0]), c = Integer.parseInt(line[1]);
int a = Integer.parseInt(line[2]), b = Integer.parseInt(line[3]);
for ( int j = a; j <= b; j++ ) inQueue[r][c][j] = true;//标记
}
LinkedList<Node> q = new LinkedList<Node>();//队列
q.add(new Node(1, 1, 0));//初始点
while ( !q.isEmpty() ) {//BFS
Node temp = q.get(0);
q.remove(0);
if ( temp.r == n && temp.c == m ) {//到达终点
System.out.println(temp.time);
break;
}
//移动检测
for ( int i = 0; i < direction.length; i++ ) {
int r = temp.r + direction[i][0], c = temp.c + direction[i][1], time = temp.time+1;
if ( r > 0 && r <= n && c > 0 && c <= m && !inQueue[r][c][time] ) {//如果不越界且未访问
q.add(new Node(r, c, time));
inQueue[r][c][time] = true;
}
}
}
}
}
class Node {
int r, c, time;//行、列、时间
public Node(int r, int c, int time) {
this.r = r;
this.c = c;
this.time = time;
}
@Override
public String toString() {
return "r=" + r + ", c=" + c + ", time=" + time;//调试用的
}
}