方阵填数:nton.pas
在一个N N的方阵中,填入1,2,……N N个数,并要求构成如下的格式:
N=6
16 17 18 19 20 1
15 30 31 32 21 2
14 29 36 33 22 3
13 28 35 34 23 4
12 27 26 25 24 5
11 10 9 8 7 6 |
输入文件:只有一个数字:n(n<=20)
输出文件;输出所方阵,数字之间用空格隔开。
样例:
输入:
5
输出:
13 14 15 16 1
12 23 24 17 2
11 22 25 18 3
10 21 20 19 4
9 8 7 6 5
这个问题通用的解决方法是先把你初始矩阵以图中1 2 3 4 ……这样的顺序导入到一个一维数组中,然后再把这个一维数组以同样的方式导出为一个和上面格式一样的矩阵中,问题的关键在于如何以这样的方式遍列这个矩阵。以C语言来解决这个问题,我只写如何遍列这个矩阵,将它导入到一个一维数组中,余下的就简单了。
以上你这个矩阵我把它定义为一个二维数组,就定义在一个M[6][6]二维数组中
一维数组是A[]
public class Test {
public static void main(String[] args) {
writeF(6);
System.out.println("\r\n");
writeF(5);
System.out.println("\r\n");
writeF(4);
System.out.println("\r\n");
writeF(3);
System.out.println("\r\n");
writeF(2);
System.out.println("\r\n");
writeF(1);
}
public static void writeF(int num) {
int x = num - 1;// x坐标
int y = 0;// y坐标
int numti = num;// 代替起始数字
int[][] a = new int[num][num];
int begin = 1;// 起始的数字
int zui = 0;// 最低坐标
for (; y < numti; y++) {// 第一循环是y坐标增加处理
if(begin>num*num){
break;//判断不要让其数字大于本身需要排列数字,还进入整理
}
a[x + zui][y + zui] = begin;
begin++;
if (y == numti - 1) {// 在y轴达到顶峰值时,开始是x逐渐下降的时候
x--;
for (; x >= 0; x--) {
a[x + zui][y + zui] = begin;
begin++;
if (x == 0) {// 在x轴达到底点时,开始是y轴下降时
y--;
for (; y >= 0; y--) {
a[x + zui][y + zui] = begin;
begin++;
if (y == 0) {// 在y轴降到底点时,开始是x轴上升时,此时画三个边
x++;
boolean jiru = false;
for (; x < numti - 1; x++) {
jiru=true;
a[x + zui][y + zui] = begin;
begin++;
if (x == numti - 2) {// 此时画了一圈,开始需要跳出时
numti = numti - 2;
y = -1;
x = numti - 1;
zui++;
break;
}
}
if (!jiru) {// 避免前面x++时更改值,如果跳出循环会继续进入情况,如果没有进入前面循环,需要还原数据
x--;// 还原
}
break;
}
}
break;
}
}
}
}
for (int i = 0; i < num; i++) {// y
for (int j = 0; j < num; j++) {// x
System.out.print(a[j][i] + "\t");
}
System.out.println("");
}
}
}