黑马程序员技术交流社区

标题: 螺旋矩阵,来看看 [打印本页]

作者: aohn1117    时间: 2015-11-27 23:51
标题: 螺旋矩阵,来看看
package com.baidu.text;

import java.util.Scanner;

public class SpiralArray {

    public static void main(String[] args) {
                Scanner sc = new Scanner(System.in);
                final int L = sc.nextInt();
                int[][] arr = new int[L][L];
                // 从i = 0, j = 0起开始迭代; m = 0, n = 1, 螺旋起始向右转; y = 0, 螺旋起始位置
                arr[0][0] = spiralArray(arr, 0, 0, 0, 1, 0);

                // 打印L阶螺旋矩阵
                for (int[] is : arr) {
                        for (int i : is) {
                        System.out.print(i + "                ");
                        }
                        System.out.println();
                }
    }

    // 迭代法求L阶螺旋矩阵, 其中 m, n分别控制矩阵行和列的转向, y为螺旋位置
    public static int spiralArray(int[][] arr, int i, int j, int m, int n, int y) {

                int l = arr.length; // 外螺旋长度
                int turn = l - 1; // 第一个转向点
                if (y == l * l - 1) { // 终点
                        return arr[i][j] = l * l;
                }

                if (y == turn) { // 到达第一个转向点, 开始向下转
                        m = 1;
                        n = 0;
                }
                // 从第一个转向点开始, 每转向2次, 循环长度减1.
                for (int k = 1;; k++) {
                        if (y == (turn += l - k)) { // 左上或者右下转向点, 向左或者向右转
                                n = -m;
                                m = 0;
                                break;
                        } else if (y < turn) { // 未到转向点, 此时螺旋位置处于左方或右方
                                break;
                        } else if (y == (turn += l - k)) { // 右上或者左下转向点, 向下或者向上转
                                m = n;
                                n = 0;
                                break;
                        } else if (y < turn) // 未到转向点, 此时螺旋位置处于上方或下方
                                break;
                }
                return arr[i][j] = spiralArray(arr, i + m, j + n, m, n, ++y) - 1; // 迭代,螺旋前进一个位置.
    }
}
作者: hansnowqiang    时间: 2015-11-28 10:23
琢磨琢磨 挺有意思

作者: bulala    时间: 2015-12-7 19:05
学习了





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2