Robots on ice
前言
最近算法课布置的作业是2010年acm世界总决赛的I题
UVA上题号1098,牛客网搜索题目可以搜到
题目原文不过多赘述可移步
博客1
题目中文解释及分析移步
博客2
以上是我在CSDN能找到的两篇分享,都是c/c++代码实现,由于本人需要JAVA实现,所以参照以上的解题逻辑写了JAVA版的题解,算法层面没有什么创新。在vjuge https://vjudge.net/problem/UVA-1098 上分别跑了上述博客中的c++代码和自己写的java代码,c++770ms,java1360ms。java明显耗时多挺多
不过明显都比其他答题者的答案耗时长(一般耗时都在300ms左右)…最强的大佬竟然只用了93ms!
我的妈敢问是哪路神仙,这么优质的代码很遗憾没有共享,虽然我相信哪怕开源了我也看不懂代码逻辑…
JAVA实现
代码注释写的比较详细了,参考上述两篇博客可以看懂的。深搜加剪枝,关键在于剪枝条件的判定以及辅助的数据结构初始值指定。
import java.util.Scanner;
import static java.lang.Math.abs;
public class RobotsOnIce {
int maxn = 11;
int[][] dir = {
{
1, 0}, {
0, 1}, {
-1, 0}, {
0, -1}}; //上、右、下、左四个方向
int n, m, l; //n:列,m:行,l:总路长n*m
int[] X = new int[5]; //指定的第i个检查点的坐标为(X[i],Y[i]),步数为C[i]
int[] Y = new int[5];
int[] C = new int[5];
int[][] map; //用于记录检测点的位置和序号,起点(0,0)序号为1,三个检测点为2、3、4,终点(0,1)序号为4.暂不初始化数组
boolean[][] checked =