import java.util.Arrays;
interface Callback {
void visit(int[] p); // n-dimensional point
}
public class Main
{
// bounds[] - each number the limits iteration on i'th axis from 0 to bounds[i]
// current - current dimension
// callback - point
public static void visit(int[] bounds, int[] p, Callback c) {
int numDimensions = p.length;
int currentDimension = numDimensions - 1;
while (true)
{
for (int i = 0; i < bounds[currentDimension]; i++) {
p[currentDimension] = i;
c.visit(p);
}
while (--currentDimension >= 0 && p[currentDimension] == bounds[currentDimension] - 1);
if (currentDimension < 0) break;
p[currentDimension++]++;
for (; currentDimension < numDimensions - 1; currentDimension++)
p[currentDimension] = 0;
}
}
static long visits = 0;
/// now visiting
public static void main
(String[] args
) { long start
= System.
currentTimeMillis(); visit(new int[] {50,50,50,50}, new int[4], new Callback() {
public void visit(int[] p) {
//System.out.println(Arrays.toString(p));
visits++;
}
});
long end
= System.
currentTimeMillis(); System.
out.
println(visits
+ " visits"); System.
out.
println("Time: " + (end
- start
) + " ms"); }
}
aW1wb3J0IGphdmEudXRpbC5BcnJheXM7CgppbnRlcmZhY2UgQ2FsbGJhY2sgewogICB2b2lkIHZpc2l0KGludFtdIHApOyAvLyBuLWRpbWVuc2lvbmFsIHBvaW50Cn0KCnB1YmxpYyBjbGFzcyBNYWluCnsKCgkvLyBib3VuZHNbXSAtIGVhY2ggbnVtYmVyIHRoZSBsaW1pdHMgaXRlcmF0aW9uIG9uIGkndGggYXhpcyBmcm9tIDAgdG8gYm91bmRzW2ldCgkvLyBjdXJyZW50IC0gY3VycmVudCBkaW1lbnNpb24KCS8vIGNhbGxiYWNrIC0gcG9pbnQKCXB1YmxpYyBzdGF0aWMgdm9pZCB2aXNpdChpbnRbXSBib3VuZHMsIGludFtdIHAsIENhbGxiYWNrIGMpIHsKCQlpbnQgbnVtRGltZW5zaW9ucyA9IHAubGVuZ3RoOwoJCWludCBjdXJyZW50RGltZW5zaW9uID0gbnVtRGltZW5zaW9ucyAtIDE7CgkJCgkJd2hpbGUgKHRydWUpCgkJewoJCQlmb3IgKGludCBpID0gMDsgaSA8IGJvdW5kc1tjdXJyZW50RGltZW5zaW9uXTsgaSsrKSB7CgkJCQlwW2N1cnJlbnREaW1lbnNpb25dID0gaTsKCQkJCWMudmlzaXQocCk7CgkJCX0KCQkJd2hpbGUgKC0tY3VycmVudERpbWVuc2lvbiA+PSAwICYmIHBbY3VycmVudERpbWVuc2lvbl0gPT0gYm91bmRzW2N1cnJlbnREaW1lbnNpb25dIC0gMSk7CgkJCWlmIChjdXJyZW50RGltZW5zaW9uIDwgMCkgYnJlYWs7CgkJCXBbY3VycmVudERpbWVuc2lvbisrXSsrOwoJCQlmb3IgKDsgY3VycmVudERpbWVuc2lvbiA8IG51bURpbWVuc2lvbnMgLSAxOyBjdXJyZW50RGltZW5zaW9uKyspCgkJCQlwW2N1cnJlbnREaW1lbnNpb25dID0gMDsKCQl9Cgl9CgoJc3RhdGljIGxvbmcgdmlzaXRzID0gMDsKCS8vLyBub3cgdmlzaXRpbmcKCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKCQlsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CgkJdmlzaXQobmV3IGludFtdIHs1MCw1MCw1MCw1MH0sIG5ldyBpbnRbNF0sIG5ldyBDYWxsYmFjaygpIHsKCQkgICBwdWJsaWMgdm9pZCB2aXNpdChpbnRbXSBwKSB7CgkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbihBcnJheXMudG9TdHJpbmcocCkpOwoJCQkJdmlzaXRzKys7CgkJICAgfQoJCX0pOwoJCWxvbmcgZW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CgkJU3lzdGVtLm91dC5wcmludGxuKHZpc2l0cyArICIgdmlzaXRzIik7CgkJU3lzdGVtLm91dC5wcmludGxuKCJUaW1lOiAiICsgKGVuZCAtIHN0YXJ0KSArICIgbXMiKTsKCX0KCn0=