1050

螺旋矩阵,难

package com.company;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
    // write your code here
        Scanner sc=new Scanner(System.in);
        int num=sc.nextInt();
        int[] input=new int[num];
        int i=0,j=0,k;
        for (i=0;i<num;i++){
            input[i]=sc.nextInt();
        }
        int m1=minfactor(num);
        int n1=num/m1;
        int[][] data = new int[m1][n1];
        data[0][0] = input[num - 1];//其它值为0
        for (int l = num - 2; l >= 0; l--) {
            boolean up = false, down = false, left = false, right = false;
            if (i - 1 >= 0 && data[i - 1][j] == 0)
                up = true;
            if (i + 1 < m1 && data[i + 1][j] == 0)//
                down = true;
            if (j + 1 < n1 && data[i][j + 1] == 0)//
                right = true;
            if (j - 1 >= 0 && data[i][j - 1] == 0)
                left = true;
            // down right
            if (!up && down && !left && right) {//down和right为true,表示右下角的点存在
                j = j + 1;
                data[i][j] = input[l];
                continue;
            }
            // down
            if (!up && down && !left && !right) {
                i = i + 1;
                data[i][j] = input[l];
                continue;
            }
            // left down
            if (!up && down && left && !right) {
                i = i + 1;
                data[i][j] = input[l];
                continue;
            }
            // left
            if (!up && !down && left && !right) {
                j = j - 1;
                data[i][j] = input[l];
                continue;
            }
            // left up
            if (up && !down && left && !right) {
                j = j - 1;
                data[i][j] = input[l];
                continue;
            }
            // up
            if (up && !down && !left && !right) {
                i = i - 1;
                data[i][j] = input[l];
                continue;
            }
            // up right
            if (up && !down && !left && right) {
                i = i - 1;
                data[i][j] = input[l];
                continue;
            }
            // right
            if (!up && !down && !left && right) {
                j = j + 1;
                data[i][j] = input[l];
                continue;
            }
            for (i = 0; i < m1; i++) {
                for (j = 0; j < n1 - 1; j++) {
                    System.out.print(data[i][j] + " ");
                }
                System.out.println(data[i][n1 - 1]);
            }
        }
    }
    /*写一个函数,用于获取num的因数m-n的最小值
    * 思路:*/
    public static int minfactor(int num) {
        int[] fm = new int[num];
        int[] fn = new int[num];
        ArrayList<Integer> differ=new ArrayList<Integer>();
        int temp;
        int x=0;
        for (int m = 1; m <= num; m++) {
            if (num % m == 0) {
                fn[m - 1] = m;
                fm[m - 1] = num / m;
                if (fm[m - 1] < fn[m - 1]) {
                    break;
                }
                else{
                    differ.add( fm[m - 1] - fn[m - 1]);
                }

            }
        }

        Collections.sort(differ);
        for (int m = 0; m < differ.size(); m++) {
            if (fm[m] - fn[m] == differ.get(0)) {
                x= fm[m];
            }
        }
        return x;
    }

}

 

posted @ 2018-10-26 15:42  博客园机器人  阅读(255)  评论(0编辑  收藏  举报