n阶螺旋矩阵(java)

题目描述:编写一个程序,对任意输入的正整数n,产生并显示n阶螺旋式数字方阵。
如n=4时 显示的方阵为: 在这里插入图片描述
n=5时 显示的方阵为:
最外一层n=4,在这里插入图片描述
解题思路:
我所用的原理是递归加上普通的循环,从最外层开始赋值,通过递归对次外层进行赋值,赋值通过循环来实现。
给每一层循环附上条件:
在这里插入图片描述最外一层n=4,元素个数为4*n-4=12

在这里插入图片描述
最外一层n=5,元素个数为4n-4=16
次外层n=3,元素个数为4n-4=8
最内层n=1,元素个数为1(属于特殊情况)

循环部分代码:

for(int i = 1;i<=4*n-4;i++){
            if(Col<n-1+tag && Row==start){    //向右
                arr[Row][Col] = index;
                Col++;
            }
            else if(Col==n-1+tag && Row<n-1+tag){        //向下
                arr[Row][Col] = index;
                Row++;
            }
            else if(Row==n-1+tag && Col>start){        //向左
                arr[Row][Col] = index;
                Col--;
            }
            else if(Col==start && Row>start){      //向上
                arr[Row][Col] = index;
                Row--;
            }
            index++;
        }

4个 if 的执行范围分别为①②③④
在这里插入图片描述
在由外向里计算时,每往里一层,横纵的起始坐标都+1,这里我用tag来标记,最外层tag=0,每往里一层,tag++.
每层的开始坐标用start表示,最外层start=0 , 即从arr[0][0]开始
第二层start=1,从arr[1][1]开始,以此类推。
index为需要给数组赋的值,每循环一次index++.
执行完循环语句后,根据n的值判断是否进入下一层递归,
最外层与次外层之间的n相差为2,则n=n-2.

n=3,则内层n=3-2=1,属特殊情况,对其单独赋值

 if(n==3)
          arr[start+1][start+1] = index;

n>3 , 进入下一层递归

 if(n>3)
          F(start+1,arr,index,n-2,tag+1);

代码实现:

  static void F(int start,int[][] arr,int index,int n,int tag){   //仅当n>=2时使用F
      int Row = start;
      int Col = start;
      for(int i = 1;i<=4*n-4;i++){
          if(Col<n-1+tag && Row==start){    	 //向右
              arr[Row][Col] = index;
              Col++;
          }
          else if(Col==n-1+tag && Row<n-1+tag){  //向下
              arr[Row][Col] = index;
              Row++;
          }
          else if(Row==n-1+tag && Col>start){    //向左
              arr[Row][Col] = index;
              Col--;
          }
          else if(Col==start && Row>start){      //向上
              arr[Row][Col] = index;
              Row--;
          }
          index++;
      }
      if(n>3)
          F(start+1,arr,index,n-2,tag+1);
      if(n==3)
          arr[start+1][start+1] = index;
  }
}

测试类:

public static void main(String[] args){
    Scanner in = new Scanner(System.in);
    int n = in.nextInt();
    int[][] arr = new int[n][n];
    F(0,arr,1,n,0);
    for (int i = 0; i < n; i++) {	//输出矩阵
        for (int j = 0; j < n; j++) {
            System.out.print(arr[i][j]+"\t");
            if(j==n-1)
                System.out.println();
        }
    }   
}

输出示例:
在这里插入图片描述

在这里插入图片描述

  • 5
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值