- /*题目9:
- * 写一方法,打印等长的二维数组,要求从1开始的自然数由方阵的最外圈向内螺旋方式地顺序排列。 如: n = 4 则打印:
- * 1 2 3 4
- * 12 13 14 5
- * 11 16 15 6
- * 10 9 8 7
- *思路:输入的方式是一圈接一圈,那么步骤重复可以考虑递归的方式来解决。先输入一圈,然后再递归第二圈直到完成。
- *同时观察发现对称的两行对应之和相等如1+10=2+9,同样12+5=11+6,这样排出一半即可知道另一半
- *发现n取奇取偶还不一样,奇数时最中心位置无法转到,应单独给出为n*n
- */
- public class Test9 {
- //为了能在递归中用到数组则把数组变为类中成员而不是放在方法中;
- static int n=4;
- static int[][] arr=new int[n][n];
- public static void main(String[] args) {
- method(n,1,1);
- if(n%2==1){//给出当奇数时最中心位置
- arr[n/2][n/2]=n*n;
- }
- //打印结果
- for(int i=0;i<n;i++){
- for(int j=0;j<n;j++){
- System.out.println(arr[i][j]);
- }
- }
- }
- public static void method(int n,int start,int round){
- if(round>n/2){//定义递归结束边界
-
- }
- else{
- for(int i=round-1;i<n-round+1;i++){
- arr[round-1][i]=start+i-round+1;
- arr[n-round][i]=3*(n-2*round+1)+start-i+round-1;//用和减去对称的值
- if(i==n-round){
- for(int j=round;j<n-round;j++){
- arr[j][i]=start+n-3*round+2+j;
- arr[j][n-i-1]=start-7*round+4*n+3-j;//用和减去对称的值
- }
- }
- }
- start=4*(n-2*round+1)+start;
- round++;
- method(n,start,round);//递归
- }
- }
- }
复制代码 |
|