- <div class="blockcode"><blockquote>package test;
- /**
- * 思路:
- * n = 5
- * * * * * * *
- * 21 22 23 24 25 *
- * 20 7 8 9 10 *
- * 19 6 1 2 11 *
- * 18 5 4 3 12 *
- * 17 16 15 14 13 *
- * * * * * * *
- * 经过分析矩阵由两种类型的图形组成
- * 由左上部分
- * 包括左边和上边
- * 1
- *
- 7 8 9
- 6
- 5
- 21 22 23 24 25
- 20
- 19
- 18
- 17
- * 右下部分
- * 包含右边和下边
- 2
- 4 3
- 10
- 11
- 12
- 16 15 14 13
- 最后外加一层*
- *
- * @author Administrator
- *
- */
- public class Test{
- private static int x,y;
- private static int[][] arr;
- private static int count;
- /**
- * 顺时针生成左边和上边
- * @param n 边的长度
- */
- private static void left2up(int n){
- for(int i = 0; i < n; i++){
- arr[x--][y] = count++;
- }
- n--;
- x++;
- y++;
- for(int i = 0; i < n; i++){
- arr[x][y++] = count++;
- }
- }
- /**
- * 顺时针生成右边和下边
- * @param n 边的长度
- */
- private static void right2down(int n){
- for(int i = 0; i < n; i++){
- arr[x++][y] = count++;
- }
- n--;
- x--;
- y--;
- for(int i = 0; i < n; i++){
- arr[x][y--] = count++;
- }
- }
- /**
- * 从里到外顺时针旋转产生矩阵(长宽相等)
- * @param n 矩阵的规模
- */
- public static void spiral(int n){
- //起点
- x = (n - 1)/2;
- y = x;
- arr = new int[n][n];
- count = 1;
- for(int i = 1; i <= n; i++){
- if( i % 2 == 1 ){
- left2up(i);
- }else{
- right2down(i);
- }
- }
- }
-
-
- //下面的方法用于打印
- /**
- * 计算十进制数字的位数
- * @param num 要计算的数组
- * @return 返回用十进制表示这个数组时的位数
- */
- private static int count(int num){
- int cnt = 0;
- while(num != 0){
- cnt++;
- num /= 10;
- }
-
- return cnt;
- }
- /**
- * 打印一行*
- * @param m 矩阵的规模
- * @param cnt 最大数字的长度
- */
- private static void printStars(int m, int cnt){
- StringBuilder sb = new StringBuilder(getSpaces(1, cnt));
- sb.append("*");
- String str = sb.toString();
- for(int i = 0, len = m+2; i < len; i++){
- System.out.print(str);
- }
- System.out.println();
- }
- /**
- * 生成打印数字之前应该打印的空格
- * @param n 要打印的数字
- * @param cnt 数字的最大长度
- * @return 打印数字之前应该打印的空格
- */
- public static String getSpaces(int n, int cnt){
- StringBuilder spacesSb = new StringBuilder(" ");
- int tmpCnt = count(n);
- for(int k = 0; k < cnt - tmpCnt; k++){
- spacesSb.append(" ");
- }
-
- return spacesSb.toString();
- }
- /**
- * 打印生成的二维数组,保证良好的格式,每个数占有的长度相同且随着数组的大小自动调整,
- * 不够的用空格补足。
- *
- * @param matrix 要打印的数组
- * @param m 数组的行数
- * @param n 数组的列数
- */
- public static void printMatrix(int[][] matrix, int m, int n){
- int cnt = count(m*n);
- //打印一行"*"
- printStars(m, cnt);
- for(int i = 0; i < m; i++){
- System.out.print(getSpaces(1, cnt)+"*");
- for(int j = 0; j < n; j++){
- System.out.print(getSpaces(matrix[i][j], cnt));
- System.out.print(matrix[i][j]);
- }
- System.out.println(getSpaces(1, cnt)+"*");
- }
- //打印一行"*"
- printStars(m, cnt);
- }
- public static void main(String[] args){
- for(int i = 1; i <= 30; i++){
- System.out.println("n = "+i);
- spiral(i);
- printMatrix(arr,i,i);
- System.out.println();
- }
- }
- }
复制代码 |