import java.util.LinkedList;
import java.util.List;
public class Main {
public static void main
(String[] args
) { int n=12;
long totalStart
= System.
nanoTime();
final List
<int[]>[] cache
= new List[n
];
for (int chordes = 1; chordes <= n; chordes++) {
long start
= System.
nanoTime(); final int points = chordes * 2;
final List<int[]> partialResult = new LinkedList<int[]>();
for (int pos = 1; pos < points; pos+=2) {
int leftDist = pos-1;
int rightDist = points-pos-1;
if (leftDist > 0) {
List<int[]> left = cache[(leftDist / 2 - 1)];
for (int[] lpart : left) {
if (rightDist > 0) {
List<int[]> right = cache[(rightDist / 2 - 1)];
for (int[] rpart: right) {
partialResult.add(build(points, pos, lpart, rpart));
}
} else {
partialResult.add(build(points, pos, lpart, null));
}
}
} else if (rightDist > 0) {
List<int[]> right = cache[(rightDist / 2 - 1)];
for (int[] rpart: right) {
partialResult.add(build(points, pos, null, rpart));
}
} else {
partialResult.add(build(points, pos, null, null));
}
}
cache[chordes-1] = partialResult;
System.
out.
println(chordes
+ "\t" + (System.
nanoTime() - start
) + " ns"); }
final List<int[]> result = cache[n-1];
System.
out.
println("Total solutions: " + result.
size()); /*for (int[] r : result) {
for (int p : r) {
System.out.print(""+p+",");
}
System.out.println();
} */
System.
out.
println("Total time: " + (System.
nanoTime() - totalStart
)/1000000 + " ms"); }
private static int[] build(int points, int pos, int[] lpart, int[] rpart) {
int[] r = new int[points];
r[0] = pos;
r[pos] = 0;
if (lpart != null) {
int leftDist = pos-1;
System.
arraycopy(lpart,
0, r,
1, leftDist
); }
if (rpart != null) {
int rightDist = points-pos-1;
System.
arraycopy(rpart,
0, r, pos
+ 1, rightDist
); }
return r;
}
}
aW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwppbXBvcnQgamF2YS51dGlsLkxpc3Q7CgpwdWJsaWMgY2xhc3MgTWFpbiB7CiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CiAgICAgICAgaW50IG49MTI7CiAgICAgICAgbG9uZyB0b3RhbFN0YXJ0ID0gU3lzdGVtLm5hbm9UaW1lKCk7CiAgICAgICAgCiAgICAgICAgZmluYWwgTGlzdDxpbnRbXT5bXSBjYWNoZSA9IG5ldyBMaXN0W25dOwoKICAgICAgICBmb3IgKGludCBjaG9yZGVzID0gMTsgY2hvcmRlcyA8PSBuOyBjaG9yZGVzKyspIHsKICAgICAgICAgICAgbG9uZyBzdGFydCA9IFN5c3RlbS5uYW5vVGltZSgpOwogICAgICAgICAgICBmaW5hbCBpbnQgcG9pbnRzID0gY2hvcmRlcyAqIDI7CgogICAgICAgICAgICBmaW5hbCBMaXN0PGludFtdPiBwYXJ0aWFsUmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8aW50W10+KCk7CiAgICAgICAgICAgIGZvciAoaW50IHBvcyA9IDE7IHBvcyA8IHBvaW50czsgcG9zKz0yKSB7CiAgICAgICAgICAgICAgICBpbnQgbGVmdERpc3QgPSBwb3MtMTsKICAgICAgICAgICAgICAgIGludCByaWdodERpc3QgPSBwb2ludHMtcG9zLTE7CgogICAgICAgICAgICAgICAgaWYgKGxlZnREaXN0ID4gMCkgewogICAgICAgICAgICAgICAgICAgIExpc3Q8aW50W10+IGxlZnQgPSBjYWNoZVsobGVmdERpc3QgLyAyIC0gMSldOwogICAgICAgICAgICAgICAgICAgIGZvciAoaW50W10gbHBhcnQgOiBsZWZ0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyaWdodERpc3QgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PGludFtdPiByaWdodCA9IGNhY2hlWyhyaWdodERpc3QgLyAyIC0gMSldOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50W10gcnBhcnQ6IHJpZ2h0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydGlhbFJlc3VsdC5hZGQoYnVpbGQocG9pbnRzLCBwb3MsIGxwYXJ0LCBycGFydCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydGlhbFJlc3VsdC5hZGQoYnVpbGQocG9pbnRzLCBwb3MsIGxwYXJ0LCBudWxsKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJpZ2h0RGlzdCA+IDApIHsKICAgICAgICAgICAgICAgICAgICBMaXN0PGludFtdPiByaWdodCA9IGNhY2hlWyhyaWdodERpc3QgLyAyIC0gMSldOwoKICAgICAgICAgICAgICAgICAgICBmb3IgKGludFtdIHJwYXJ0OiByaWdodCkgewogICAgICAgICAgICAgICAgICAgICAgICBwYXJ0aWFsUmVzdWx0LmFkZChidWlsZChwb2ludHMsIHBvcywgbnVsbCwgcnBhcnQpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHBhcnRpYWxSZXN1bHQuYWRkKGJ1aWxkKHBvaW50cywgcG9zLCBudWxsLCBudWxsKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2FjaGVbY2hvcmRlcy0xXSA9IHBhcnRpYWxSZXN1bHQ7CiAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihjaG9yZGVzICsgIlx0IiArIChTeXN0ZW0ubmFub1RpbWUoKSAtIHN0YXJ0KSArICIgbnMiKTsKICAgICAgICB9CgogICAgICAgIGZpbmFsIExpc3Q8aW50W10+IHJlc3VsdCA9IGNhY2hlW24tMV07CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUb3RhbCBzb2x1dGlvbnM6ICIgKyByZXN1bHQuc2l6ZSgpKTsKICAgICAgICAvKmZvciAoaW50W10gciA6IHJlc3VsdCkgewogICAgICAgICAgICBmb3IgKGludCBwIDogcikgewogICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiIitwKyIsIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCk7CiAgICAgICAgfSAgKi8KICAgICAgICAKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRvdGFsIHRpbWU6ICIgKyAoU3lzdGVtLm5hbm9UaW1lKCkgLSB0b3RhbFN0YXJ0KS8xMDAwMDAwICsgIiBtcyIpOwogICAgfQoKICAgIHByaXZhdGUgc3RhdGljIGludFtdIGJ1aWxkKGludCBwb2ludHMsIGludCBwb3MsIGludFtdIGxwYXJ0LCBpbnRbXSBycGFydCkgewogICAgICAgIGludFtdIHIgPSBuZXcgaW50W3BvaW50c107CiAgICAgICAgclswXSA9IHBvczsKICAgICAgICByW3Bvc10gPSAwOwogICAgICAgIGlmIChscGFydCAhPSBudWxsKSB7CiAgICAgICAgICAgIGludCBsZWZ0RGlzdCA9IHBvcy0xOwogICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGxwYXJ0LCAwLCByLCAxLCBsZWZ0RGlzdCk7CiAgICAgICAgfQogICAgICAgIGlmIChycGFydCAhPSBudWxsKSB7CiAgICAgICAgICAgIGludCByaWdodERpc3QgPSBwb2ludHMtcG9zLTE7CiAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkocnBhcnQsIDAsIHIsIHBvcyArIDEsIHJpZ2h0RGlzdCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByOwogICAgfQoKfQo=