黑马程序员技术交流社区

标题: 用 递归 进行螺旋方阵的遍历 [打印本页]

作者: niuapp    时间: 2015-5-25 21:47
标题: 用 递归 进行螺旋方阵的遍历
递归真的挺给力,我感觉更好理解点
  1. /*
  2.         目的:在控制台输出螺旋方阵?
  3.         思路:用递归把螺旋方阵分成 一圈 + 中间
  4.                   用规模递减的方法初始化数组。
  5.                   想象一个正方形,外圈是边长为x的加号,内圈有一个边长为x-2的小正方形
  6.                         + + + + +
  7.                         + * * * +
  8.                         + * * * +
  9.                         + * * * +
  10.                         + + + + +
  11.                   先在最外圈逐个初始化二维数组,然后再把外圈放在一边,把靠着外圈的一圈当做外圈继续初始化,用规模递减的方法直到最中间
  12. */

  13. import java.util.Scanner;

  14. class ForTest12
  15. {
  16.         static int x = 0;
  17.         public static void main (String[] args)
  18.         {
  19.                 Scanner sc = new Scanner(System.in);
  20.                 System.out.print("输入数组的边长:");
  21.                 int x = sc.nextInt();        //确定螺旋方阵的边长
  22.                 int [][] arr = tianJiaA(0,x);//调用方法把最开始的位置和边长传过去,让方法创建一个二维数组并返回。

  23.                 for (int i=0; i<x; i++)//遍历螺旋方阵
  24.                 {
  25.                         for (int j=0; j<x; j++)
  26.                         {
  27.                                 System.out.print(arr[i][j]+"\t");
  28.                         }
  29.                         System.out.println();
  30.                 }
  31.         }

  32.         static int[][] tianJiaA(int a,int i)
  33.         {
  34.                 int j = i;
  35.                 int[][] arr = new int[i][j];//创建二维数组,并把这个数组传给下边的初始化方法
  36.                 tianJia(a, arr, i);//a 是 数据的起始位置([0][0]、[1][1]这些),i是数组的长度
  37.                 return arr;
  38.         }

  39.         //初始化数组的方法
  40.         static void tianJia(int a, int[][] arr, int i)
  41.         {//  a--数组起始位置0([0][0]开始), i--数组长度
  42.                
  43.                
  44.                 int j = i;//因为是 方阵 所以i==j

  45.                 for (int m=a; m<j; m++)                //从左边到右尽头
  46.                 {
  47.                         arr[a][m] = ++x;
  48.                 }
  49.                 for (int n=a+1; n<i; n++)        //从右边尽头到右下尽头
  50.                 {
  51.                         arr[n][j-1] = ++x;
  52.                 }
  53.                 for (int o=j-2; o>=a; o--)        //从右下尽头到左下尽头
  54.                 {
  55.                         arr[i-1][o] = ++x;
  56.                 }
  57.                 for (int p=i-2; p>=a+1; p--)//从左下尽头到左边
  58.                 {
  59.                         arr[p][a] = ++x;
  60.                 }
  61.                         //至此,初始化完最外圈的数组值

  62.                 if((a+1)<i-2)//递归,直到把数组中的所有值初始化完毕
  63.                 {
  64.                         tianJia(a+1, arr, i-1);
  65.                 }else if((a+1)==i-2){
  66.                         arr[a+1][a+1] = ++x;
  67.                 }else
  68.                         return;
  69.                
  70.         }
  71. }
复制代码

作者: Lucus    时间: 2015-5-25 21:57
楼主学的好快,今天刚看到这个作业!!!
作者: 汤姆大叔    时间: 2015-5-25 22:05
厉害的一笔啊。
作者: TOBESKY    时间: 2015-5-25 22:11
明天学习这个,现在楼主这里预习下,赞一个
作者: niuapp    时间: 2015-5-26 00:17
分拆 规模递减 用 递归 可以帮助分析和解决某些奇怪的问题
作者: 人在旅途~东营    时间: 2015-5-26 00:39
学习了,递归解决螺旋矩阵问题确实方便多了
作者: guoyangpeng    时间: 2015-5-26 06:42
很经典的面试题吧
作者: wwl0517    时间: 2015-5-26 09:19
经典例题,学习一下
作者: 王建伟    时间: 2015-5-26 09:48
学习了,牛、、、、、、、




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2