/* package whatever; // don't place package name! */
import java.util.*;
import java.lang.*;
import java.io.*;
/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
public static void main
(String[] args
) { final List<Integer> path = solve(3, 6, 4, 1, 3, 4, 2, 5, 3, 0);
}
}
static List<Integer> solve(int... a) {
//Value in each element is the index, from where we can come here
int[] path = new int[a.length];
Arrays.
fill(path,
-1); //No index is accessible yet
//Queue of positions that were visited from somewhere, but nothing was tried to be
//visited from them. At the beginning, 0 is in the list, because it's starting point.
//Then, if we visit index 3, it is added to this list for later processing.
Queue<Integer> posQueue = new LinkedList<>();
posQueue.add(0);
path[0] = 0; //0 index is accessible from itself, this is starting position
while (!posQueue.isEmpty()) {
int pos = posQueue.remove();
int prPos = pos - a[pos];
int nxPos = pos + a[pos];
if (prPos >= 0 && path[prPos] == -1) {
path[prPos] = pos;
posQueue.add(prPos);
}
if (nxPos < a.length && path[nxPos] == -1) {
path[nxPos] = pos;
posQueue.add(nxPos);
}
if (path[a.length-1] != -1) {
break;
}
}
if (path[a.length-1] == -1) {
return null;
}
//Collect the path
List<Integer> result = new ArrayList<>();
int idx = a.length-1;
while (idx != 0) {
result.add(0, idx);
idx = path[idx];
}
result.add(0, 0);
return result;
}
}
LyogcGFja2FnZSB3aGF0ZXZlcjsgLy8gZG9uJ3QgcGxhY2UgcGFja2FnZSBuYW1lISAqLwoKaW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS5sYW5nLio7CmltcG9ydCBqYXZhLmlvLio7CgovKiBOYW1lIG9mIHRoZSBjbGFzcyBoYXMgdG8gYmUgIk1haW4iIG9ubHkgaWYgdGhlIGNsYXNzIGlzIHB1YmxpYy4gKi8KY2xhc3MgSWRlb25lCnsKCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKICAgICAgICBmaW5hbCBMaXN0PEludGVnZXI+IHBhdGggPSBzb2x2ZSgzLCA2LCA0LCAxLCAzLCA0LCAyLCA1LCAzLCAwKTsKCiAgICAgICAgZm9yIChJbnRlZ2VyIGkgOiBwYXRoKSB7CiAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoaSArICIgLT4gIik7CiAgICAgICAgfQogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRE9ORSIpOwogICAgfQoKICAgIHN0YXRpYyBMaXN0PEludGVnZXI+IHNvbHZlKGludC4uLiBhKSB7CiAgICAgICAgLy9WYWx1ZSBpbiBlYWNoIGVsZW1lbnQgaXMgdGhlIGluZGV4LCBmcm9tIHdoZXJlIHdlIGNhbiBjb21lIGhlcmUKICAgICAgICBpbnRbXSBwYXRoID0gbmV3IGludFthLmxlbmd0aF07CiAgICAgICAgQXJyYXlzLmZpbGwocGF0aCwgLTEpOyAvL05vIGluZGV4IGlzIGFjY2Vzc2libGUgeWV0CgogICAgICAgIC8vUXVldWUgb2YgcG9zaXRpb25zIHRoYXQgd2VyZSB2aXNpdGVkIGZyb20gc29tZXdoZXJlLCBidXQgbm90aGluZyB3YXMgdHJpZWQgdG8gYmUgCiAgICAgICAgLy92aXNpdGVkIGZyb20gdGhlbS4gQXQgdGhlIGJlZ2lubmluZywgMCBpcyBpbiB0aGUgbGlzdCwgYmVjYXVzZSBpdCdzIHN0YXJ0aW5nIHBvaW50LgogICAgICAgIC8vVGhlbiwgaWYgd2UgdmlzaXQgaW5kZXggMywgaXQgaXMgYWRkZWQgdG8gdGhpcyBsaXN0IGZvciBsYXRlciBwcm9jZXNzaW5nLgogICAgICAgIFF1ZXVlPEludGVnZXI+IHBvc1F1ZXVlID0gbmV3IExpbmtlZExpc3Q8PigpOwogICAgICAgIHBvc1F1ZXVlLmFkZCgwKTsKICAgICAgICBwYXRoWzBdID0gMDsgLy8wIGluZGV4IGlzIGFjY2Vzc2libGUgZnJvbSBpdHNlbGYsIHRoaXMgaXMgc3RhcnRpbmcgcG9zaXRpb24KCiAgICAgICAgd2hpbGUgKCFwb3NRdWV1ZS5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgaW50IHBvcyA9IHBvc1F1ZXVlLnJlbW92ZSgpOwogICAgICAgICAgICBpbnQgcHJQb3MgPSBwb3MgLSBhW3Bvc107CiAgICAgICAgICAgIGludCBueFBvcyA9IHBvcyArIGFbcG9zXTsKICAgICAgICAgICAgaWYgKHByUG9zID49IDAgJiYgcGF0aFtwclBvc10gPT0gLTEpIHsKICAgICAgICAgICAgICAgIHBhdGhbcHJQb3NdID0gcG9zOwogICAgICAgICAgICAgICAgcG9zUXVldWUuYWRkKHByUG9zKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAobnhQb3MgPCBhLmxlbmd0aCAmJiBwYXRoW254UG9zXSA9PSAtMSkgewogICAgICAgICAgICAgICAgcGF0aFtueFBvc10gPSBwb3M7CiAgICAgICAgICAgICAgICBwb3NRdWV1ZS5hZGQobnhQb3MpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAocGF0aFthLmxlbmd0aC0xXSAhPSAtMSkgewogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmIChwYXRoW2EubGVuZ3RoLTFdID09IC0xKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KCiAgICAgICAgLy9Db2xsZWN0IHRoZSBwYXRoCiAgICAgICAgTGlzdDxJbnRlZ2VyPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKICAgICAgICBpbnQgaWR4ID0gYS5sZW5ndGgtMTsKICAgICAgICB3aGlsZSAoaWR4ICE9IDApIHsKICAgICAgICAgICAgcmVzdWx0LmFkZCgwLCBpZHgpOwogICAgICAgICAgICBpZHggPSBwYXRoW2lkeF07CiAgICAgICAgfQogICAgICAgIHJlc3VsdC5hZGQoMCwgMCk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KfQ==