用java如何实现1到81的螺旋状输出

随雪 2013-11-13 07:00:34
用java如何实现1到81的螺旋状输出,求牛人解决此问题[color=#00FFFF][/color]
...全文
1153 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Mourinho 2013-11-15
  • 打赏
  • 举报
回复
引用 3 楼 u011067756 的回复:
多谢二楼的指点,但是我想要的效果是这样的 ... 14 13 5 4 3 12 6 1 2 11 7 8 9 10 实现这个,且从1开始输出 这里,我是觉的程序是按顺序输出的,好像不太可能先输出下面的,再输出上面的
改成这样只需要从大到小输出,再改变一下输出方向。 LZ试着改改吧

 65 64 63 62 61 60 59 58 57
 66 37 36 35 34 33 32 31 56
 67 38 17 16 15 14 13 30 55
 68 39 18  5  4  3 12 29 54
 69 40 19  6  1  2 11 28 53
 70 41 20  7  8  9 10 27 52
 71 42 21 22 23 24 25 26 51
 72 43 44 45 46 47 48 49 50
 73 74 75 76 77 78 79 80 81
Mourinho 2013-11-15
  • 打赏
  • 举报
回复
以前做过类似的题目 思路: 按照右,下,左,上四个方向依次给数组赋值。 数组最上行,最右列,最下行,最左列依次为0,n-1,n-1,0。 当按照右方向赋值结束时,最上行加1, 当按照下方向赋值结束时,最右列减1, 当按照左方向赋值结束时,最左列加1, 当按照上方向赋值结束时,最下行减1, 实际上,顺序改变初始方向顺序可以输出4个方向的螺旋矩阵。


public class Test01 {

	public static void main(String[] args) {
		spiralRectPrint(9);
	}
	
    public static void spiralRectPrint(int n){  
        if(n < 1){  
            System.out.println("输入参数不正确");  
            return;  
        }  
        final int TOTAL = n * n;  
        final int[] DIRECTION = new int[]{0,1,2,3};//右,下,左,上  
        final int MAX_LENGTH = String.valueOf(TOTAL).length();//最大数位数,用于打印对齐  
        int firstRow = 0,firstCol = 0;  
        int lastRow = n - 1,lastCol = n - 1;  
        int directionIndex = 0;//初始方向为右  
        int num = 1;  
        int[][] printArray = new int[n][n];//最后输出的数组  
        while(num <= TOTAL){  
            switch (DIRECTION[directionIndex % DIRECTION.length]) {  
            case 0:  
                for(int i = firstCol;i <= lastCol;++i)  
                    printArray[firstRow][i] = num++;  
                ++firstRow;  
                break;  
            case 1:  
                for(int i = firstRow;i <= lastRow;++i)  
                    printArray[i][lastCol] = num++;  
                --lastCol;  
                break;  
            case 2:  
                for(int i = lastCol;i >= firstCol;--i)  
                    printArray[lastRow][i] = num++;  
                --lastRow;  
                break;  
            case 3:  
                for(int i = lastRow;i >= firstRow;--i)  
                    printArray[i][firstCol] = num++;  
                ++firstCol;  
                break;  
            }  
            ++directionIndex;  
        }  
        //输出  
        for(int i = 0;i < n;++i){  
            for(int j = 0; j < n;++j){  
                int value = printArray[i][j];                             
                for(int k = 0; k <= MAX_LENGTH - String.valueOf(value).length();++k)  
                    System.out.print(" ");  
                System.out.print(value);  
            }  
            System.out.println();  
        }  
    }  
}

ganshenml 2013-11-13
  • 打赏
  • 举报
回复
引用 3 楼 u011067756 的回复:
多谢二楼的指点,但是我想要的效果是这样的 ... 14 13 5 4 3 12 6 1 2 11 7 8 9 10 实现这个,且从1开始输出 这里,我是觉的程序是按顺序输出的,好像不太可能先输出下面的,再输出上面的
这是到算法题,要分几种情况,因为不能确定有多少行,多少列,但是唯一能确定的是,先产生行,后产生列,也就是在除开不能组成完整的外围数字后,剩下的一定是n行和n-1行所组成的矩形;当然外围的数字能完全围住里面的内容的话,那么行数是与列数相等的,也就是正方形。 这就需要进行判断了,到底外围的数字情况是怎么样的,是在左边,右边,上面,还是下面多出了最后的一条! 当然这其中输出的数字的规律要自己去发现了!
随雪 2013-11-13
  • 打赏
  • 举报
回复
多谢二楼的指点,但是我想要的效果是这样的 ... 14 13 5 4 3 12 6 1 2 11 7 8 9 10 实现这个,且从1开始输出 这里,我是觉的程序是按顺序输出的,好像不太可能先输出下面的,再输出上面的
threenewbee 2013-11-13
  • 打赏
  • 举报
回复
http://www.haogongju.net/art/589762 http://blog.csdn.net/s_yangmuwang/article/details/6261942
随雪 2013-11-13
  • 打赏
  • 举报
回复
效果如下: ... 14 13 5 4 3 12 6 1 2 11 7 8 9 10

51,409

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧