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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© aohn1117 中级黑马   /  2015-11-30 23:56  /  428 人查看  /  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 个回复

倒序浏览
这是一道面试题。其实也就是找到规律就好写点。拐点。
回复 使用道具 举报
Ansel_young 来自手机 中级黑马 2015-12-1 19:27:40
藤椅
学习了~碰到这样的真没有思路
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马