从键盘输入一个整数(1~20) 则以该数字为矩阵的大小,把1,2,3…n*n 的数字按照顺时针螺旋的形式填入其中。

来源:互联网 发布:筑巢软件怎么样 编辑:程序博客网 时间:2024/05/16 12:02
/* *从键盘输入一个整数(1~20)则以该数字为矩阵的大小,把1,2,3…n*n 的数字按照顺时针螺旋的形式填入其中。例如:输入数字2,则程序输出:1 24 3输入数字3,则程序输出:1 2 38 9 47 6 5输入数字4, 则程序输出:1  2   3   412  13  14  511  16  15  610   9  8   7*/import java.util.Scanner;public class Demo08 {public static void show(int[][] m) {for(int[] x:m){for(int y:x){System.out.print(y+"\t");}System.out.println("");}}// 顺时针螺旋public static int[][] helix(int n) {int[][] m = new int[n][n];// 产生空矩阵int t = n*n;// 填充矩阵从1到n*n个数int i = 0;// 填充数字的位置(行下标) int j = 0;// 填充数字的位置(列下标) int start = 0;// 每填充一圈时用的边界(左上)int end = n;// 每填充一圈时用的边界(右下)int x = 0;// 填充左侧一竖列数字时用的起始位置(行下标)int y = 0;// 填充左侧一竖列数字时用的起始位置(列下标)int count = 0;// 标记那段程序执行,那段程序不执行for(int s=1;s<=t;s++){if(i==start&&j<end){// 如果是第一行m[i][j++] = s;// 填充第一行}else if(i<end-1&&count<1){// count==0时处理j = end-1;// 列设置为右边界i++;// 行下标 下移}if(i>start&&i<end){if(j>start){if(i==end-1){// 到下边界了m[i][j--] = s;// 填充下边界}else{m[i][j] = s;// 填充右侧一竖列数字}}else if(count==0){// 只当count==0 时执行一次m[i][j] = s;// 填充到了左下角的元素i--;// 开始从下向上填充左侧元素(行坐标上移)x = i;// 用新的下标x来填充左侧 (行下标)y = j;// 用新的下标y来填充左侧 (列下标)count++;}else if(x>start&&y<end){m[x--][y] = s;// 填充左侧}else if(x==start){// 如果外圈填充完毕s--;// 接下来填充的数字放到下一的内圈里(抵消循环的s++)start++;// 左上角边界向内收缩 1end = --n;// 右下角边界向内收缩 1i = start;// 按边界的位置开始填充内圈(行下标)j = start;// 按边界的位置开始填充内圈(列下标)x = i;// 填充左侧一竖列数字时用的起始位置(行下标)y = j;// 填充左侧一竖列数字时用的起始位置(列下标)count = 0;// 恢复执行程序段的标记}}}return m;// 返回矩阵}public static void main(String[] args){Scanner scan = new Scanner(System.in);System.out.print("输入一个整数:");int n = scan.nextInt();// 输入 n int[][] m = helix(n);// 矩阵大小为n*nshow(m);// 输出矩阵}}
运行结果:
输入一个整数:412341213145111615610987

自己写的,用到的控制变量比较多,所以程序读起来容易混乱!

整体思路(外圈实现: 

1. 从(左->右)填充第一行

 2.从(上->下)填充右侧一列

 3.从(右->左)填充最后一行 

4.从(下->上)填充左侧一列

只要最外圈能做出来,内圈同理,调整变量就可以了)

方法二:

public class Demo08_two {public static void show(int[][] m) {for (int[] x : m) {for (int y : x) {System.out.print(y + "\t");}System.out.println("");}}public static void helix(int n, int b, int[][] a) {int i;int j;int k;for (i = 0; i < n / 2; i++) {for (j = i; j < n - i; j++)/* 四个循环按不同的方向进行 */a[i][j] = ++b;for (k = i + 1, j--; k < n - i; k++)a[k][j] = ++b;for (j = --k, j--; j >= i; j--)a[k][j] = ++b;for (k--; k > i; k--)a[k][i] = ++b;}if (n % 2 != 0) /* 如果是单数的话,要加上最大的那个数放在中间 */a[i][i] = ++b;}public static void main(String[] args) {Scanner scan = new Scanner(System.in);int i, j, k, n, b = 0;System.out.print("输入一个整数:");n = scan.nextInt();int[][] a = new int[n][n];helix(n, b, a);show(a);}}
运行结果:
输入一个整数:412341213145111615610987



原创粉丝点击