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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

©   /  2014-4-30 08:09  /  5620 人查看  /  20 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

有详细注释,用树的深度搜索想法实现。本人原创,转载请注明。
  1. public class Test9 {

  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 static void main(String[] args) {
  12.                 Test9 test = new Test9();
  13.                 //从键盘接收一个数,动态确定数组大小
  14.                 System.out.println("请输入一个数,来作为您的二位数组维度:");
  15.                
  16.                 Scanner sc = new Scanner(System.in);
  17.                 int num = sc.nextInt();
  18.                 int[][] arr = new int[num][num];
  19.                
  20.                 //数组初始值都设置为0,代表每一位还没有被访问过。
  21.                 for(int i=0;i<num;i++){
  22.                         for(int j=0;j<num;j++)
  23.                                 arr[i][j] = 0;
  24.                 }
  25.                
  26.                 /*观察得数字运动路线为:右,下,左,上。所有定义变量来记录上一个数字运动方向。
  27.                   右:1  下:2  左:3 上:4 .第一步肯定往右,所有move初始值为1.
  28.                  */
  29.                 int move =1;
  30.                 int step =0;//记录步数
  31.                 int i=0,j=0;//初始位置
  32.        
  33.                 while(step < num*num){
  34.                         move = test.printArr(arr, i, j, move, num);
  35.                         switch(move){
  36.                                 case 1:
  37.                                         arr[i][j++] = ++step;                               
  38.                                         break;
  39.                                 case 2:
  40.                                         arr[i++][j] = ++step;                               
  41.                                         break;
  42.                                 case 3:
  43.                                         arr[i][j--] = ++step;                               
  44.                                         break;
  45.                                 case 4:
  46.                                         arr[i--][j] = ++step;                               
  47.                                         break;
  48.                                 case -1:
  49.                                         break;
  50.                         }
  51.                 }
  52.        
  53.                 //输出数组
  54.                 for(int m=0;m<num;m++){
  55.                         for(int n=0;n<num;n++){
  56.                                 System.out.print(arr[m][n]+"   ");
  57.                         }               
  58.                         System.out.println("");
  59.                 }
  60.         }
  61.        
  62.         //根据上一步的运动,以及边界条件来判断下一步该往哪个方向运动
  63.         public int printArr(int[][]arr,int i,int j,int move,int num){
  64.                 //如果上一步是向右走,则判断该位置右侧是否已被访问或已达边界,是返回2,指示下一步向下走,否则返回1继续向右走
  65.                 if(move == 1){
  66.                         if((j+1)>=num || arr[i][j+1] !=0){
  67.                                 return 2;
  68.                         }
  69.                         else return 1;
  70.                 }
  71.                 //如果上一步向下走,则判断该位置下面位置是否已被访问或已达边界,是返回3,指示下一步向左走,否返回2继续下走。
  72.                 else if(move == 2){
  73.                         if((i+1)>=num || arr[i+1][j] != 0){
  74.                                 return 3;
  75.                         }
  76.                         else return 2;
  77.                 }
  78.                 //如果上一步向左走,则判断该位置左侧位置是否已被访问或已达边界,是返回4,指示下一步向上走,否返回3继续左走。
  79.                 else if(move == 3){
  80.                         if(j<=0 || arr[i][j-1] != 0){
  81.                                 return 4;
  82.                         }
  83.                         else return 3;
  84.                 }
  85.                 //如果上一步向上走,则判断该位置上面位置是否已被访问或已达边界,是返回1,指示下一步向右走,否返回4继续向上走。
  86.                 else if(move == 4){
  87.                         if(i<=0 || arr[i-1][j] != 0){
  88.                                 return 1;
  89.                         }
  90.                         else return 4;
  91.                 }
  92.                 return -1;
  93.                
  94.         }
  95. }
复制代码

评分

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

查看全部评分

回复 使用道具 举报 1 0
您需要登录后才可以回帖 登录 | 加入黑马