从键盘输入一个整数(1~20) 则以该数字为矩阵的大小,把1,2,3…n*n 的数字按照顺时针螺旋的形式填入其中。
2013-04-02 21:11
507 查看
/* * 从键盘输入一个整数(1~20) 则以该数字为矩阵的大小,把1,2,3…n*n 的数字按照顺时针螺旋的形式填入其中。例如: 输入数字2,则程序输出: 1 2 4 3 输入数字3,则程序输出: 1 2 3 8 9 4 7 6 5 输入数字4, 则程序输出: 1 2 3 4 12 13 14 5 11 16 15 6 10 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 ; // 产生空矩阵 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++; // 左上角边界向内收缩 1 end = --n; // 右下角边界向内收缩 1 i = 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*n show(m); // 输出矩阵 } }运行结果:
输入一个整数:4 1 2 3 4 12 13 14 5 11 16 15 6 10 9 8 7
自己写的,用到的控制变量比较多,所以程序读起来容易混乱!
整体思路: (外圈实现:
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 ; helix(n, b, a); show(a); } }运行结果:
输入一个整数:4 1 2 3 4 12 13 14 5 11 16 15 6 10 9 8 7
相关文章推荐
- 从键盘输入一个整数(1~20) 则以该数字为矩阵的大小,把1,2,3…n*n 的数字按照顺时针螺旋的形式填入其中。
- 以该数字为矩阵的大小,把1,2,3…n*n 的数字按照顺时针螺旋的形式填入其中
- 随笔:把1,2,3…n*n 的数字按照顺时针螺旋的形式填入数字矩阵
- 1,2,3…n*n 的数字按照顺时针螺旋的形式打印成矩阵(递归)
- 1,2,3…n*n 的数字按照顺时针螺旋的形式打印成矩阵(递归)
- 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,
- 剑指offer面试题:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字
- 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.
- 输入一个矩阵,按照从外向里以顺时针的顺序依次扫印出每一个数字
- 输入一个矩阵,按照从外到里以顺时针的顺序依次打印每一个数字
- C++输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,
- 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字
- 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8
- 剑指offer_输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字
- [python] 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字[顺时针打印矩阵]
- 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8
- 输入一个矩阵,按照从外向里顺时针的顺序依次打印出每一个数字
- 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字
- java-51-输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
- 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8