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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© heimaheima123 中级黑马   /  2014-12-13 21:05  /  4911 人查看  /  35 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

输出 n=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
求大神指教

评分

参与人数 1黑马币 +3 收起 理由
杨佳名 + 3

查看全部评分

35 个回复

倒序浏览
同问~坐等大神来呀:Q
回复 使用道具 举报
一块坐等,伤不起啊
回复 使用道具 举报
干想可不行,这种题你拿一只笔,在纸上画一下,在写个二维数组,找规律
  1. package com.gotoheima;

  2. /**
  3. *
  4. * 写一方法,打印等长的二维数组,要求从1开始的自然数由方阵的最外圈向内螺旋方式地顺序排列。 如: n = 4 则打印:
  5. * 1        2        3        4
  6. * 12        13        14        5
  7. * 11        16        15        6
  8. * 10        9        8        7
  9. *
  10. */
  11. public class Test18
  12. {
  13.         public static void main(String[] args)
  14.         {
  15.                 printMath(60);
  16.         }
  17.        
  18.         public static void printMath(int n)
  19.         {
  20.                 int[][] arr = new int[n][n];
  21.                 int x = 0;
  22.                 int y = 0;
  23.                 int max = arr.length-1;
  24.                 int min = 0;
  25.                 int num = 1;
  26.                
  27.                 while (min<=max)
  28.                 {
  29.                         //right
  30.                         while (y<max)
  31.                         {
  32.                                 arr[x][y++] = num++;
  33.                         }
  34.                         //down
  35.                         while (x<max)
  36.                         {
  37.                                 arr[x++][y] = num++;
  38.                         }
  39.                         //left
  40.                         while (y>min)
  41.                         {
  42.                                 arr[x][y--] = num++;
  43.                         }
  44.                         //up
  45.                         while (x>min)
  46.                         {
  47.                                 arr[x--][y] = num++;
  48.                         }
  49.                         //如果是奇数,可能赋值不上
  50.                         if (min == max)
  51.                         {
  52.                                 arr[x][y] = num;
  53.                         }
  54.                        
  55.                         max--;
  56.                         min++;
  57.                        
  58.                         x++;
  59.                         y++;
  60.                 }
  61.                
  62.                 for (int i=0;i<arr.length;i++)
  63.                 {
  64.                         for (int j=0;j<arr.length;j++)
  65.                         {
  66.                                 System.out.print(arr[i][j]+"\t");
  67.                         }
  68.                         System.out.println();
  69.                 }
  70.         }
  71. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1

查看全部评分

回复 使用道具 举报
run_wind 发表于 2014-12-13 21:28
干想可不行,这种题你拿一只笔,在纸上画一下,在写个二维数组,找规律
...

你的思路想不错,赞一个,能写点注释就更好了~

点评

需要大神注解。  发表于 2014-12-14 09:26
回复 使用道具 举报
run_wind 发表于 2014-12-13 21:28
干想可不行,这种题你拿一只笔,在纸上画一下,在写个二维数组,找规律
...

不用数组可以么?求大黑马指教
回复 使用道具 举报
run_wind 发表于 2014-12-13 21:28
干想可不行,这种题你拿一只笔,在纸上画一下,在写个二维数组,找规律
...

不用数组可以么?求指教
回复 使用道具 举报
大神,不错。赞一个。
回复 使用道具 举报
大神用数组做的,我等小虾米还没学到那程度,慢慢来
回复 使用道具 举报
me  too  ,me too
回复 使用道具 举报
大神,树上说不可以用数组,要用嵌套或者之前的知识去做,求大神解答啊~
回复 使用道具 举报
run_wind 发表于 2014-12-13 21:28
干想可不行,这种题你拿一只笔,在纸上画一下,在写个二维数组,找规律
...

大神啊,太赞了,加上注释就完美了
回复 使用道具 举报
自己感觉建立转向标示比较容易不过也可以用递归
public class Demo{
        private int[,] _SpiralMatrix;
        private int _N;

        public SpiralMatrix(int n)
        {
            _SpiralMatrix = new int[n, n];
            _N = n;
        }
        /// <summary>
        /// 递归算法
        /// </summary>
        /// <param name="start">start:矩阵开始的位置,如为0表示矩阵[0,0]元素</param>
        /// <param name="num">矩阵的维数</param>
        /// <param name="begin">起始数字</param>
        public void Computer(int start,int num,int begin)
        {
            if (start == num)//输入为偶数时
            {
                return;
            }
            else if (start == num - 1)//输入为奇数时
            {
                _SpiralMatrix[start, num - 1] = begin;
                return;               
            }
            else
            {
                for (int i = start; i < num; i++)
                {
                    _SpiralMatrix[start,i] = begin;
                    begin++;
                }
                for (int j = start + 1; j < num; j++)
                {
                    _SpiralMatrix[j, num - 1] = begin;
                    begin++;
                }
                for (int k = num - 2; k >= start; k--)
                {
                    _SpiralMatrix[num-1, k] = begin;
                    begin++;
                }
                for (int l = num - 2; l >= start+1; l--)
                {
                    _SpiralMatrix[l, start] = begin;
                    begin++;
                }
                Computer(start + 1, num - 1, begin);
            }
        }

        /// <summary>
        /// 字符串化,方便对象输出
        /// </summary>
        /// <returns>字符串后的矩阵</returns>
        public string ToString()
        {
            string temp="";
            for(int i=0;i<_N;i++)
            {
                for(int j=0;j<_N;j++)
                {
                    temp+=_SpiralMatrix[i,j]+" ";
                }
                temp+="\r\n";
            }
            return temp;
        }
   

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1

查看全部评分

回复 使用道具 举报
董晗 中级黑马 2014-12-13 22:03:38
14#
看不懂。。。前面基础不好
回复 使用道具 举报
好吧,你们这个我不懂,但是我也想知道,不用数组能不能做。脑细胞各种死。
回复 使用道具 举报
run_wind 发表于 2014-12-13 21:28
干想可不行,这种题你拿一只笔,在纸上画一下,在写个二维数组,找规律
...

你这不加注释看起来还真是费劲啊!!!
回复 使用道具 举报
冥夜 中级黑马 2014-12-14 00:00:35
17#
  1. public static void main(String[] args)
  2.         {
  3.                 printLuoxuan(6);
  4.         }

  5.         private static void printLuoxuan(int i)
  6.         {
  7.                 //整体思路,既然是螺旋矩阵就螺旋赋值,num为保存的数字。首先观察到赋值是向右,向下,向左,向上进行赋值,然后每次都重复这个过程直到全部赋值完毕。
  8.                 //每完成一次循环都会使坐标值变化1.所以用count表示圈数来进行赋值
  9.                 int[][] arr=new int[i][i];
  10.                 int num=1;//赋值的数字
  11.             int count=0;//圈数
  12.                 while(num<(i*i+1))//i阶螺旋矩阵总共i*i个数
  13.                 {
  14.                         for(int j=count;j<i-count;j++)//从最左上开始赋值,向右赋值。第一圈纵坐标是0,第二是1.。。
  15.                                 arr[j][count]=num++;
  16.                        
  17.                         for(int j=count+1;j<i-count;j++)//向下赋值,第一圈横坐标是i-1,第二圈是i-2..。
  18.                                 arr[i-count-1][j]=num++;
  19.                                
  20.                         for(int j=i-count-2;j>count-1;j--)//向左赋值,第一圈纵坐标是i-1,第二圈是i-2。。。
  21.                                 arr[j][i-count-1]=num++;
  22.                        
  23.                         for(int j=i-count-2;j>count;j--)//向上赋值,第一圈横坐标是0,第二圈是1.。。
  24.                                 arr[count][j]=num++;
  25.                         count++;//走完一圈圈数+1
  26.                 }
  27.                
  28.                 for(int y=0;y<i;y++)
  29.                 {
  30.                         for(int x=0;x<i;x++)
  31.                         {
  32.                                 System.out.print(arr[x][y]+"\t");
  33.                         }
  34.                         System.out.println();
  35.                 }
  36.         }
复制代码

评分

参与人数 1技术分 +2 收起 理由
杨佳名 + 2

查看全部评分

回复 使用道具 举报
heimaheima123 发表于 2014-12-13 21:51
大神啊,太赞了,加上注释就完美了

这个帖子不水!够给力
回复 使用道具 举报
还没学数组。。。。。
回复 使用道具 举报
Eagle 高级黑马 2014-12-14 03:00:08
20#

搞得不错,嘿嘿。思路杠杠滴,学习你的思路又自己思考,终于还是自己做出来了
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马