/*
* 从键盘输入一个整数(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[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&&jstart&&istart){
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
运行结果:
输入一个整数: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[n][n];
helix(n, b, a);
show(a);
}
}
运行结果:
输入一个整数:4
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7