回形数格式方阵的实现

回形数格式方阵的实现
从键盘输入一个整数(1~20)
则以该数字为矩阵的大小,把1,2,3…n*n 的数字按照顺时针螺旋的形式填入其中。
例如: 输入数字2,则程序输出:
1 2
4 3
输入数字3,则程序输出:
1 2 3
8 9 4
7 6 5
输入数字4, 则程序输出:
1   2   3   4
12  13  14  5
11  16  15  6
10   9  8   7
输入数字5, 则程序输出:
1   2   3   4   5
16  17  18  19  6
15  24  25  20  7
14  23  22  21  8
13  12  11  10  9

package com.ly.code.day07.work;

import java.util.Scanner;
/* *回形数格式方阵的实现
从键盘输入一个整数(1~20)
则以该数字为矩阵的大小,把1,2,3…n*n 的数字按照顺时针螺旋的形式填入其中。
例如: 输入数字2,则程序输出:
1 2
4 3
输入数字3,则程序输出:
1 2 3
8 9 4
7 6 5
输入数字4, 则程序输出:
1   2   3   4
12  13  14  5
11  16  15  6
10   9  8   7
输入数字5, 则程序输出:
1   2   3   4   5
16  17  18  19  6
15  24  25  20  7
14  23  22  21  8
13  12  11  10  9

* */
public class RectangleTest {
    //方法一:
/*
    public static void main(String[] args) {
        Scanner scan =new Scanner(System.in);
        System.out.println("请输入一个数字:");
        int len = scan.nextInt();
        int[][] arr = new int[len][len];

        int s = len * len;
        */
/*
        *k = 1:向右,k = 2:向下,k = 3:向左,k = 4:向上。
        * *//*

        int k = 1;
        int i = 0,j = 0;
        for (int m = 1; m <= s; m++) {
            if (k == 1) {//向右
                //arr[i][j] == 0说明是第一行,i=0。
                if(j < len && arr[i][j] == 0){
                    arr[i][j++] = m;
                }else {
                    k = 2;//向下
                    i++;//行+1
                    j--;//列-1
                    m--;//依次递减
                }
            }else if(k==2){//向下
                if(i < len && arr[i][j] == 0){
                    arr[i++][j] = m;
                }else {
                    k = 3;
                    i--;
                    j--;
                    m--;
                }
            }else if(k == 3){
                if(j >= 0 && arr[i][j] == 0){
                    arr[i][j--] = m;
                }else {
                    k = 4;
                    i--;
                    j++;
                    m--;
                }
            }else if(k == 4){//向上
                if(i >= 0 && arr[i][j] == 0){
                    arr[i--][j] = m;
                }else {
                    k = 1;
                    i++;
                    j++;
                    m--;
                }
            }
        }
        //遍历
        for (int m = 0; m < arr.length; m++) {
            for (int n = 0; n < arr[m].length; n++) {
                System.out.print(arr[m][n] + "\t");
            }
            System.out.println();//换行
        }
    }
*/
    //方法二:

    public static void main(String[] args) {
        int n =6;
        int[][] arr = new int[n][n];

        int count = 0;//要显示的数据
        int maxL = n - 1;//行的最大下标x
        int maxH = n - 1;//列的最大下标y
        int minL = 0;//行的最小下标
        int minH = 0;//列的最小下标
        while(minL <= maxL){//行和列一直再往中间靠近,靠近中心点。而中心点的 最小列增长 接近 逐渐减小的最大列 。
            //向右
            for (int l = minL; l <= maxL; l++){
                //上面第一行,列改变
                arr[minH][l] = ++count;//++count,count先自增一,再赋值。 count=1;
            }
            //第一行结束,最小行要+1;
            minH++;

            //向下
            for(int h = minH; h <= maxH; h++){
                //右边最后一列
                arr[h][maxL] = ++count;
            }
            //最后一列结束,最大列要-1;
            maxL--;

            //向左
            for (int l = maxL; l >= minL ; l--) {
                //最后一行
                arr[maxH][l] = ++count;
            }
            //最后一行结束,行要-1;
            maxH--;

            //向上
            for (int h = maxH; h >=minH ; h--) {
                //最左一列
                arr[h][minL] = ++count;
            }
            //最左一列结束,列要+1;
            minL++;
        }

/*      int n =4;
        int[][] arr = new int[n][n];

        int count = 0;//要显示的数据
        int maxX = n - 1;//x轴的最大下标
        int maxY = n - 1;//y轴的最大下标
        int minX = 0;//x轴的最小下标
        int minY = 0;//y轴的最小下标
        while (minX <= maxX){
            for (int x = minX; x <= maxX; x++) {
                arr[minY][x] = ++count;
            }
            minY++;
            for (int y = minY; y <= maxY; y++) {
                arr[y][maxX] = ++count;
            }
            maxX--;
            for (int x = maxX; x >= minX; x--) {
                arr[maxY][x] = ++count;
            }
            maxY--;
            for (int y = maxY; y >= minY; y--) {
                arr[y][minX] = ++count;
            }
            minX++;
        }

        */
        //遍历
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr.length; j++) {
                String space = (arr[i][j] + "").length() == 1 ? "0" : "";
                System.out.print(space + arr[i][j] + " ");
            }
            System.out.println();//换行
        }
    }




}

输出结果:

01 02 03 04 05 06 
20 21 22 23 24 07 
19 32 33 34 25 08 
18 31 36 35 26 09 
17 30 29 28 27 10 
16 15 14 13 12 11 

修改版:

package com.ly.code.day07.work;

import java.util.Scanner;
/* *回形数格式方阵的实现
从键盘输入一个整数(1~20)
则以该数字为矩阵的大小,把1,2,3…n*n 的数字按照顺时针螺旋的形式填入其中。
例如: 输入数字2,则程序输出:
1 2
4 3
输入数字3,则程序输出:
1 2 3
8 9 4
7 6 5
输入数字4, 则程序输出:
1   2   3   4
12  13  14  5
11  16  15  6
10   9  8   7
输入数字5, 则程序输出:
1   2   3   4   5
16  17  18  19  6
15  24  25  20  7
14  23  22  21  8
13  12  11  10  9

* */
public class RectangleTest {
    //方法一:
/*
    public static void main(String[] args) {
        Scanner scan =new Scanner(System.in);
        System.out.println("请输入一个数字:");
        int len = scan.nextInt();
        int[][] arr = new int[len][len];

        int s = len * len;
        */
/*
        *k = 1:向右,k = 2:向下,k = 3:向左,k = 4:向上。
        * *//*

        int k = 1;
        int i = 0,j = 0;
        for (int m = 1; m <= s; m++) {
            if (k == 1) {//向右
                //arr[i][j] == 0说明是第一行,i=0。
                if(j < len && arr[i][j] == 0){
                    arr[i][j++] = m;
                }else {
                    k = 2;//向下
                    i++;//行+1
                    j--;//列-1
                    m--;//依次递减
                }
            }else if(k==2){//向下
                if(i < len && arr[i][j] == 0){
                    arr[i++][j] = m;
                }else {
                    k = 3;
                    i--;
                    j--;
                    m--;
                }
            }else if(k == 3){
                if(j >= 0 && arr[i][j] == 0){
                    arr[i][j--] = m;
                }else {
                    k = 4;
                    i--;
                    j++;
                    m--;
                }
            }else if(k == 4){//向上
                if(i >= 0 && arr[i][j] == 0){
                    arr[i--][j] = m;
                }else {
                    k = 1;
                    i++;
                    j++;
                    m--;
                }
            }
        }
        //遍历
        for (int m = 0; m < arr.length; m++) {
            for (int n = 0; n < arr[m].length; n++) {
                System.out.print(arr[m][n] + "\t");
            }
            System.out.println();//换行
        }
    }
*/
    //方法二:

    public static void main(String[] args) {
        Scanner scan =new Scanner(System.in);
        System.out.println("请输入一个数字:");
        int n = scan.nextInt();
        int[][] arr = new int[n][n];

        int count = 0;//要显示的数据
        int maxL = n - 1;//行的最大下标x
        int maxH = n - 1;//列的最大下标y
        int minL = 0;//行的最小下标
        int minH = 0;//列的最小下标
        while(minL <= maxL){//行和列一直再往中间靠近,靠近中心点。而中心点的 最小列增长 接近 逐渐减小的最大列 。
            //向右
            for (int l = minL; l <= maxL; l++){
                //上面第一行,列改变
                arr[minH][l] = ++count;//++count,count先自增一,再赋值。 count=1;
            }
            //第一行结束,最小行的值要+1;
            minH++;

            //向下
            for(int h = minH; h <= maxH; h++){
                //右边最后一列
                arr[h][maxL] = ++count;
            }
            //最后一列结束,最大列的值要-1;
            maxL--;

            //向左
            for (int l = maxL; l >= minL ; l--) {
                //最后一行
                arr[maxH][l] = ++count;
            }
            //最后一行结束,最后一行的值要-1;
            maxH--;

            //向上
            for (int h = maxH; h >=minH ; h--) {
                //最左一列
                arr[h][minL] = ++count;
            }
            //最左一列结束,最左一列的值要+1;
            minL++;
        }

/*      int n =4;
        int[][] arr = new int[n][n];

        int count = 0;//要显示的数据
        int maxX = n - 1;//x轴的最大下标
        int maxY = n - 1;//y轴的最大下标
        int minX = 0;//x轴的最小下标
        int minY = 0;//y轴的最小下标
        while (minX <= maxX){
            for (int x = minX; x <= maxX; x++) {
                arr[minY][x] = ++count;
            }
            minY++;
            for (int y = minY; y <= maxY; y++) {
                arr[y][maxX] = ++count;
            }
            maxX--;
            for (int x = maxX; x >= minX; x--) {
                arr[maxY][x] = ++count;
            }
            maxY--;
            for (int y = maxY; y >= minY; y--) {
                arr[y][minX] = ++count;
            }
            minX++;
        }

        */
        //遍历
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr.length; j++) {
                //arr[i][j] + "",把数组变成了一个字符串,然后计算长度,就可以看出是个位数还是几位数!!!
                String space = (arr[i][j] + "").length() == 1 ? "0" : "";
                System.out.print(space + arr[i][j] + " ");
            }
            System.out.println();//换行
        }
        //10以上的数字出现三位数,可以排列出三位添加
        //遍历
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr.length; j++) {
                //arr[i][j] + "",把数组变成了一个字符串,然后计算长度,就可以看出是个位数还是几位数!!!
                String space ="";
                if(n>=10){
                    if((arr[i][j] + "").length() == 1){
                        space ="00";
                    }else if((arr[i][j] + "").length() == 2){
                        space ="0";
                    }else if((arr[i][j] + "").length() == 3){
                        space ="";
                    }
                }else {
                    space = (arr[i][j] + "").length() == 1 ? "0" : "";
                }
                System.out.print(space + arr[i][j] + " ");
            }
            System.out.println();//换行
        }


        int b[][] = new int[3][3];
        b[0][1] = 2;
        b[0][2] = 22;
        b[1][0] = 265;
        System.out.println((b[0][1]+"").length());
        System.out.println((b[0][2]+"").length());
        System.out.println((b[1][0]+"").length());





    }






}

输出结果:


请输入一个数字:
19
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 
72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 20 
71 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 90 21 
70 135 192 193 194 195 196 197 198 199 200 201 202 203 204 205 152 91 22 
69 134 191 240 241 242 243 244 245 246 247 248 249 250 251 206 153 92 23 
68 133 190 239 280 281 282 283 284 285 286 287 288 289 252 207 154 93 24 
67 132 189 238 279 312 313 314 315 316 317 318 319 290 253 208 155 94 25 
66 131 188 237 278 311 336 337 338 339 340 341 320 291 254 209 156 95 26 
65 130 187 236 277 310 335 352 353 354 355 342 321 292 255 210 157 96 27 
64 129 186 235 276 309 334 351 360 361 356 343 322 293 256 211 158 97 28 
63 128 185 234 275 308 333 350 359 358 357 344 323 294 257 212 159 98 29 
62 127 184 233 274 307 332 349 348 347 346 345 324 295 258 213 160 99 30 
61 126 183 232 273 306 331 330 329 328 327 326 325 296 259 214 161 100 31 
60 125 182 231 272 305 304 303 302 301 300 299 298 297 260 215 162 101 32 
59 124 181 230 271 270 269 268 267 266 265 264 263 262 261 216 163 102 33 
58 123 180 229 228 227 226 225 224 223 222 221 220 219 218 217 164 103 34 
57 122 179 178 177 176 175 174 173 172 171 170 169 168 167 166 165 104 35 
56 121 120 119 118 117 116 115 114 113 112 111 110 109 108 107 106 105 36 
55 54 53 52 51 50 49 48 47 46 45 44 43 42 41 40 39 38 37 
001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 018 019 
072 073 074 075 076 077 078 079 080 081 082 083 084 085 086 087 088 089 020 
071 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 090 021 
070 135 192 193 194 195 196 197 198 199 200 201 202 203 204 205 152 091 022 
069 134 191 240 241 242 243 244 245 246 247 248 249 250 251 206 153 092 023 
068 133 190 239 280 281 282 283 284 285 286 287 288 289 252 207 154 093 024 
067 132 189 238 279 312 313 314 315 316 317 318 319 290 253 208 155 094 025 
066 131 188 237 278 311 336 337 338 339 340 341 320 291 254 209 156 095 026 
065 130 187 236 277 310 335 352 353 354 355 342 321 292 255 210 157 096 027 
064 129 186 235 276 309 334 351 360 361 356 343 322 293 256 211 158 097 028 
063 128 185 234 275 308 333 350 359 358 357 344 323 294 257 212 159 098 029 
062 127 184 233 274 307 332 349 348 347 346 345 324 295 258 213 160 099 030 
061 126 183 232 273 306 331 330 329 328 327 326 325 296 259 214 161 100 031 
060 125 182 231 272 305 304 303 302 301 300 299 298 297 260 215 162 101 032 
059 124 181 230 271 270 269 268 267 266 265 264 263 262 261 216 163 102 033 
058 123 180 229 228 227 226 225 224 223 222 221 220 219 218 217 164 103 034 
057 122 179 178 177 176 175 174 173 172 171 170 169 168 167 166 165 104 035 
056 121 120 119 118 117 116 115 114 113 112 111 110 109 108 107 106 105 036 
055 054 053 052 051 050 049 048 047 046 045 044 043 042 041 040 039 038 037 
1
2
3

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值