题目描述:编写一个程序,对任意输入的正整数n,产生并显示n阶螺旋式数字方阵。
如n=4时 显示的方阵为:
n=5时 显示的方阵为:
解题思路:
我所用的原理是递归加上普通的循环,从最外层开始赋值,通过递归对次外层进行赋值,赋值通过循环来实现。
给每一层循环附上条件:
最外一层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();
}
}
}
输出示例: