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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

  1. /*
  2.         第四题:
  3.         输出 n=5 的螺旋方阵
  4.         1  2  3  4  5
  5.         16 17 18 19 6
  6.         15 24 25 20 7
  7.         14 23 22 21 8
  8.         13 12 11 10 9
  9.        
  10.         思路:
  11.                 打印这一组数首先想到的是一行一行打印,但是很麻烦
  12.                 然后我们可以考虑到用二维数组吧数字装起来打印
  13.                 arr{{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}}
  14.                 这样就是基本上解决这个问题了,数据存入有很多方法
  15.                 我使用的是固定角标 一层一层向内输出
  16.                 但是我的方法有一个弊端奇数时中心的最后打印不出
  17. */
  18. import java.util.Scanner;
  19. class Day04_04
  20. {
  21.         public static void main(String[] args){
  22.                 Scanner s = new Scanner (System.in);
  23.                 while(true){
  24.                         System.out.println("请输入一个正整数:");
  25.                         int x = s.nextInt();
  26.                         Alg(x);       
  27.                 }

  28.         }
  29.         public static void Alg(int n){
  30.                 int arr[][]=new int[n][n];                        //定义一个数组用于储存
  31.                 for (int x=0,y=0,i=1,kx=0,ky=0;i<n*n;kx++,ky++){        //x,y分别用于做二维数组 的X,变量和y变量,i为当前二位数组的值,
  32.                                                                                                                         //kx,ky分别代表着x的增量和y的增量,作用为循环向内移动一层
  33.                         //这里是数据从左往右移动,X不变Y变,kx和ky在此处分别给x,y赋值
  34.                         //表示数组角标向内一层,y<n-1-ky,是把y的可循环的值向内减一
  35.                         //该循环打印的值是  1、2、3、4 ,17、18
  36.                         for (x=kx,y=ky;y<n-1-ky;y++,i++){
  37.                                 arr[x][y]=i;//x=0;y=4
  38.                         }
  39.                         //这里是数据从上往下移动,Y不变X变,x,y刚好可以沿用上一次的值
  40.                         //表示数组角标向内一层,x<n-1-ky,是把x的可循环的值向内减一
  41.                         //该循环打印的值是5、6、7、8, 19、20                       
  42.                         for (;x<n-1-kx;x++,i++){
  43.                                 arr[x][y]=i;//x=4;y=4
  44.                         }
  45.                         //这里是数据从右往左移动,X不变Y变,x,y刚好可以沿用上一次的值
  46.                         //表示数组角标向内一层,y>0+ky,是把y的可循环的值向内减一
  47.                         //该循环打印的值是 9\1\0\11\12,21\22
  48.                         for (;y>0+ky;y--,i++){
  49.                                 arr[x][y]=i;//x=4;y=0
  50.                         }
  51.                         //这里是数据从下往上移动,Y不变X变,x,y刚好可以沿用上一次的值
  52.                         //表示数组角标向内一层,x>0+kx,是把x的可循环的值向内减一
  53.                         //打印的值分别是13\14\15\16,23,24       
  54.                         for (;x>0+kx;x--,i++){
  55.                                 arr[x][y]=i;//y=0;x=0
  56.                         }
  57.                        
  58.                 }       
  59.                 //然后我们会发现当我们输入奇数的时候最后一个值打印不出求各位大神打救
  60.                 //这个就是把最后一个值打印出来的判断
  61.                 if(n%2!=0){
  62.                         int m=(n-1)/2;
  63.                         arr[m][m]=n*n;
  64.                 }
  65.         //        遍历数组,打印
  66.                 for (int i=0;i<n ;i++ )
  67.                 {
  68.                         for (int j=0;j<n ;j++ )
  69.                         {
  70.                                 System.out.print(arr[i][j]+"\t");
  71.                         }
  72.                         System.out.println();
  73.                 }
  74.         }
  75. }
复制代码


评分

参与人数 1技术分 +1 收起 理由
lwj123 + 1

查看全部评分

32 个回复

倒序浏览
不错,转转就转晕了,注释写的很好
回复 使用道具 举报
作为还在hello world混的,
我表示我看不明白
回复 使用道具 举报
必须赞一个,我头都转晕了我,都没看出来!
回复 使用道具 举报
果然代码还是自己写的才看的清楚··
回复 使用道具 举报
还是有点没看明白
回复 使用道具 举报
转晕了,不过注释写的很好!
回复 使用道具 举报
求给位帮我看看啊,我中间那个用了if强行打印的,但是应该可以全部用for打印的啊
回复 使用道具 举报
转成螺丝了  不明白
回复 使用道具 举报
好厉害啊!!!!!!!
回复 使用道具 举报
tu3 发表于 2015-4-7 21:21
作为还在hello world混的,
我表示我看不明白

你的黑马币-4是怎么做到的????
回复 使用道具 举报
i=1;i<n*n....这才到24吧。。。加个等于号应该就可以了吧
回复 使用道具 举报
大神都,表示菜鸟还看不明白
回复 使用道具 举报

加个等号整个程序就疯掉了,因为25的时候没有满足的for然后就无线循环了
回复 使用道具 举报
太赞了!!!!!!
回复 使用道具 举报
表示这个看不懂
回复 使用道具 举报
同样基于按层填充思路,递归版本。按层填充,应该都是要考虑奇偶差别的
  1. public class Tests {

  2.         public static void main(String[] args) {
  3.                 int[][] a = new int[8][8];
  4.                 fill(a, 0, 1);
  5. //                fill1(a);
  6.                 printSquare(a);
  7.                
  8.         }
  9.         
  10.         public static void fill(int[][] square, int layer, int num) {
  11.                 int len = square.length - layer * 2;
  12.                 if (len == 0)
  13.                         return;
  14.                 if (len == 1) {
  15.                         square[layer][layer] = num;
  16.                         return;
  17.                 }
  18.                 int row = layer, col = layer;
  19.                 for (;col < square.length - layer; col++)
  20.                         square[row][col] = num++;
  21.                
  22.                 for (col--, row++;row < square.length - layer; row++)
  23.                         square[row][col] = num++;
  24.                 for (row--, col--;col >= layer; col--)
  25.                         square[row][col] = num++;
  26.                 for (col++, row--; row > layer; row--)
  27.                         square[row][col] = num++;
  28.                 fill(square, layer+1, num);
  29.         }
  30. }
复制代码
回复 使用道具 举报
大神的世界我们永远不懂,还是继续去敲hello world
回复 使用道具 举报
fantacyleo 发表于 2015-4-7 22:42
同样基于按层填充思路,递归版本。按层填充,应该都是要考虑奇偶差别的
...

额  大哥你这个好像和我那个好像,但是也是一种的方式;但是没有解决我的问题啊{:3_62:}
回复 使用道具 举报
随缘就好 发表于 2015-4-7 23:07
额  大哥你这个好像和我那个好像,但是也是一种的方式;但是没有解决我的问题啊 ...

已经告诉你了嘛:同样基于按层填充思路。当然看着像。不过我刚才试了一下,我这个代码实际上已经解决了奇偶判断问题:
  1. public static void fill(int[][] square, int layer, int num) {
  2.                 int start = square.length - layer * 2;
  3.                 if (start <= 0)
  4.                         return;
  5.        
  6.                 int row = layer, col = layer;
  7.                 for (;col < square.length - layer; col++)
  8.                         square[row][col] = num++;
  9.                
  10.                 for (col--, row++;row < square.length - layer; row++)
  11.                         square[row][col] = num++;
  12.                 for (row--, col--;col >= layer; col--)
  13.                         square[row][col] = num++;
  14.                 for (col++, row--; row > layer; row--)
  15.                         square[row][col] = num++;
  16.                 fill(square, layer+1, num);
  17.           
  18.          
  19.         }
复制代码
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马