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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© niuapp 中级黑马   /  2015-5-25 21:47  /  921 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

递归真的挺给力,我感觉更好理解点
  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. }
复制代码

评分

参与人数 1黑马币 +10 收起 理由
汤姆大叔 + 10 很给力!今天的作业啊 。

查看全部评分

8 个回复

倒序浏览
楼主学的好快,今天刚看到这个作业!!!
回复 使用道具 举报
厉害的一笔啊。
回复 使用道具 举报
明天学习这个,现在楼主这里预习下,赞一个
回复 使用道具 举报
niuapp 来自手机 中级黑马 2015-5-26 00:17:45
报纸
分拆 规模递减 用 递归 可以帮助分析和解决某些奇怪的问题
回复 使用道具 举报
学习了,递归解决螺旋矩阵问题确实方便多了
回复 使用道具 举报
guoyangpeng 来自手机 中级黑马 2015-5-26 06:42:59
7#
很经典的面试题吧
回复 使用道具 举报
经典例题,学习一下
回复 使用道具 举报
学习了,牛、、、、、、、
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马