IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> PAT乙级1050 螺旋矩阵 java实现 -> 正文阅读

[Java知识库]PAT乙级1050 螺旋矩阵 java实现

思路:观察发现,在填充过程中,总能找到一个时刻,使得二维矩阵的“最外层”均填充完毕,同时“内层?”均未被填充过。于是可以以“圈”为单位考虑整个填充过程,即每次循环填充一圈。而每一圈由四个填充过程组成,分别是最上层,最右层,最下层,最左层。当每一层填充完毕后,便向内层收缩一圈,例如最上层是向下移动一行。需要注意的是每层填充都会把下一次填充时要填的第一个数填掉,所以除了整个填充过程中的第一次填充,其余每层都要跳过上一层的最后一个数,从本层的第二个数开始填充

代码如下:

import java.io.*;
import java.util.*;

public class Main {

    //找n的方法,从算数平方根向下查询,找到的第一个
    public static int Factor(int a){
        int factor=0;
        for(int i=(int)Math.sqrt(a);i>=1;i--){
            if(a%i==0) {
                factor=i;
                break;
            }
        }
        return factor;
    }

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
        StreamTokenizer in = new StreamTokenizer(br);
        in.nextToken();

        int N=(int)in.nval;
        int n=Factor(N),m=N/n;

        int[] data=new int[N];
        for(int i=0;i<N;i++){
            in.nextToken();
            data[i]=(int)in.nval;
        }
        //sort后逆序填入螺旋矩阵
        Arrays.sort(data);


        int[][] result=new int[m][n];
        //用来记录有没有填完的计数器
        int count=0;
        /*
        floor:每个循环中填充的最下面一行
        ceil:每个循环中填充的最上面一行
         */
        int floorRow=m-1,ceilRow=0;
        /*
        right:每个循环中填充的最右边一列
        left:每个循环中填充的最左边一列
         */
        int right=n-1,left=0;

        /*
        每次填一圈 由于不知道具体哪个小循环过后会填完,所以每个小循环后都判断一下count,如果填完break
         */
        while(count<N){
            //取当前填充的最上边一行,从左往右填充
            for(int i=left;i<=right;i++){
                result[ceilRow][i]=data[N-1-count];
                count++;
            }
            if(count==N) break;

            //由于上一次填充把最右边一列的第一个数要填的数填掉了,所以ceil下降一行
            ceilRow++;
            //取当前填充的最右边一列,从上往下填充
            for(int j=ceilRow;j<=floorRow;j++){
                result[j][right]=data[N-1-count];
                count++;
            }
            if(count==N) break;

            //由于上一次填充把最下边一行的第一个要填的数填掉了,所以right左移一列
            right--;
            //取当前填充的最下边一行,从右往左填充
            for(int i=right;i>=left;i--){
                result[floorRow][i]=data[N-1-count];
                count++;
            }
            if(count==N) break;

            //由于上一次填充把最左边一列的第一个要填的数填掉了,所以floor上移一列
            floorRow--;
            for(int j=floorRow;j>=ceilRow;j--){
                result[j][left]=data[N-1-count];
                count++;
            }
            if(count==N) break;

            //下一圈时,由于上一圈的最后一次填充把当前填充的最上边一列的第一个要填的数填掉了,所以left右移一列
            left++;
        }


        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                if(j==n-1){
                    out.print(result[i][j]);
                }
                else{
                out.print(result[i][j]+" ");
                }
            }
            out.println();
        }

        out.flush();

    }
}

这道题是压线AC的,提交了好几发,终于把测试点6,7都过了?

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-02-06 13:41:29  更:2022-02-06 13:43:57 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 9:44:08-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码