我使用这两个简单的循环从高度到底部、从右到左搜索网格。
for(int y=0; y<height; y++){
for(int x=width; x>=0; x--){
}
}
基本上,我想像下图中的数字那样横向搜索网格,直到它覆盖所有单元格。我的方法效果不佳,所以我在这里寻求帮助。
我怎样才能以最快的方式做到这一点?我相信这应该可以只使用两个循环来完成,但我无法弄清楚。
以下将做到这一点:
final int h = 4;
final int w = 3;
for (int d = 0; d < w + h; d++) {
for (int y = 0; y < h; y++) {
int x = w - d + y;
if (x < 0 || x >= w) continue;
System.out.printf("%d %d\n", x, y);
}
}
这里,h
是高度,w
是网格的宽度。
该算法基于以下观察:对于每个对角线,到顶部边缘和右侧边缘的距离之和保持不变。
外部循环遍历对角线;内循环,在对角线上的所有单元格上。