题目:Z字形编排
思路:
想象一根45度角的斜线,如下图,从左上角往右下角扫描,第一次将0串起来,第二次将1,2串起来,第三次将3,4,5串起来,以此类推。
接下来寻找每根线条与串联的元素的个数的关系,以及每个元素所在坐标变化范围之间的关系。
根据上图,找规律:
第一根线,坐标范围是0-0,只有一个元素,[0][0]
第二根线,坐标范围是0-1;有2个元素,[0][1] [1][0]
第三根线,坐标范围是0-2;有三个元素,[0][2] [1][1] [2][0]
……
由此可见,每条线和元素在坐标中的位置范围的关系。
0,0 0,1 0,2 0,3 0,4 0,5 0,6 0,7
1,0 1,1 1,2 1,3 1,4 1,5 1,6 1,7
2,0 2,1 2,2 2,3 2,4 2,5 2,6 2,7
3,0 3,1 3,2 3,3 3,4 3,5 3,6 3,7
4,0 4,1 4,2 4,3 4,4 4,5 4,6 4,7
5,0 5,1 5,2 5,3 5,4 5,5 5,6 5,7
6,0 6,1 6,2 6,3 6,4 6,5 6,6 6,7
7,0 7,1 7,2 7,3 7,4 7,5 7,6 7,7
假设y坐标是表示行的,x坐标是表示列。
每条线上的坐标的取值范围,规律如下:
y从0到当前线条根数,x坐标从当前线条根数到0,比如:[0][2] [1][1] [2][0] 2就是当前线条根数;
上面只能算出一半,即:左上角的一半三角形。
接下来就要思考右下角的坐标变化范围了。
右下角的坐标取值范围规律如下:
第9条:1-7;
第10条:2-7
以此类推。。。。
由此可见,右下角规律如下:
x坐标 从 1-7 (7就是数组宽度减去1)
y坐标 就是 当前线条数 超出 数组宽度-1 的值 也就是 当前线条的根数 – (数组宽度-1)
最后还是看代码实现:java的,其他语言类似:
import java.util.Scanner;
public class test {
@SuppressWarnings("resource")
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个数字:");
int width = sc.nextInt();
for(int y=0; y<width; y++) {
for (int x=0; x<width; x++) {
System.out.print(y+","+x+"\t");
}
System.out.println();
}
int[][] nums = new int[width][width];
int n = 0;
for (int i = 0; i < (width - 1) * 2 + 1; i++) {
int x = -1, y = -1;
for (int j = (i < (width - 1) ? 0 : i - (width-1)); j <= (i > (width - 1) ? width-1 : i); j++) {
if (i % 2 == 0) {
y = j;
x = i - j;
} else {
y = j;
x = i - j;
}
nums[y][x] = n;
++n;
}
}
for (int y = 0; y < width; y++) {
for (int x = 0; x < width; x++) {
System.out.print(nums[y][x] + "\t");
}
System.out.println();
}
}
}
运行效果: