A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© aohn1117 中级黑马   /  2015-11-27 23:51  /  729 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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; // 迭代,螺旋前进一个位置.
    }
}

2 个回复

倒序浏览
琢磨琢磨 挺有意思
回复 使用道具 举报
学习了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马