问题
解决思想(递归)
将矩阵从里到外分为多层,每一层都是一个口字型数字序列,方向都是顺时针,由此我们可以将问题分解为相同的子问题,采用递归算法源代码
import java.util.Scanner;
/**
*
* @author Vinsmoke
*
*
* 打印回形矩阵
*
*
*/
public class Pattern {
static int n;
static int sum; //矩阵数字总个数
static int flag = 1;
static int[][] pattern;
/*
* 打印图案功能,其中n为图案矩阵的行列数
*/
static void printPattern(int layer) {
// 上:赋值
for (int i = layer; i < n - layer - 1; i++) {
pattern[layer][i] = flag++;
if (flag > sum)
return;
}
// 右:赋值
for (int i = layer; i < n - layer - 1; i++) {
pattern[i][n - layer - 1] = flag++;
if (flag > sum)
return;
}
// 下:赋值
for (int i = n - layer - 1; i > layer; i--) {
pattern[n - layer - 1][i] = flag++;
if (flag > sum)
return;
}
// 左:赋值
for (int i = n - layer - 1; i > layer; i--) {
pattern[i][layer] = flag++;
if (flag > sum)
return;
}
printPattern(++layer);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("请输入矩阵的行列数:");
Scanner scan = new Scanner(System.in);
n = scan.nextInt();
pattern = new int[n][n];
//预处理奇偶数的不同
if(n%2==0)
sum=n*n;
else{
sum=n*n-1;
pattern[(n-1)/2][(n-1)/2]=n*n;
}
printPattern(0); //递归
// 输出图案
for (int[] row : pattern) {
for (int column : row) {
System.out.print(column + "\t");
}
System.out.println();
}
}
}