题目描述:
输入整数 N,输出一个N 阶的回字形二维数组。
数组的最外层为 1, 次外层为 2,以此类推。
输入格式:
输入包含多行,每行包含一个整数 N。
当输入行为 N= 0时,表示输入结束,且该行无需作任何处理。
输出格式:
对于每个输入的整数 N ,输出一个满足要求的 N 阶二维数组。
每个数组占 N 行,每行包含 N 个用空格个隔开的整数。
数据范围:
0 ≤ N ≤ 100
输入样例:
1
2
3
4
5
0
输出样例:
1
1 1
1 1
1 1 1
1 2 1
1 1 1
1 1 1 1
1 2 2 1
1 2 2 1
1 1 1 1
1 1 1 1 1
1 2 2 2 1
1 2 3 2 1
1 2 2 2 1
1 1 1 1 1
解题思路:
解法一(找规律啦)
1,通过观察回子形矩阵,矩阵关于对角线是左上方和右下方对称的
2,利用二维行列循环,获取行列+1的最小值(即mid(i+1,j+1)),可得如下图形(例如 n = 4);
1 1 1 1
1 2 22
1 23 3
12 3 4
可以看出未画横线的部分(左上部分)满足题解,此时如果使图像沿着对角线翻转,再重合,即可求解答案
3,翻转图像,采用(min(n - i,n - j))即可实现,可得到图像如下(例如:n = 4);
4 3 2 1
3 3 2 1
2 2 2 1
1 1 1 1
4,进行图像的重合,对应位置取最小值即可求解(min(Left上,Rigt下));
代码实现如下:
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
while(true){
int n = sc.nextInt() ;
for (int i = 0; i < n; i ++){
for(int j = 0; j < n ; j++){
System.out.print(Math.min(Math.min(i +1,j +1),Math.min(n - i,n - j))+ " ");
}
System.out.println();
}
if(n == 0){
return;
}
System.out.println();
}
}
}
解法二(曼哈顿距离)
1,当 n 为奇数时,找取中间的点 n/2 分别于行 i 列 j 的距离的最大值(max(abs(n/2 - i),abs(n/2 - j))),可以的如下图形(例如 n = 5):
2 2 2 2 2
2 1 1 1 2
2 1 0 1 2
2 1 1 1 2
2 2 2 2 2
2,观察结果,随着回形越深入,内外围回形相差为 1,因此想到(n + 1)/2
3,当 n 为为偶数时,采用同样的的方法,这里我们就让中心点在图形的中间位置(n - 1)/ 2.0,再求解其分别于行 i 列 j 的距离的最大值(max(abs(n - 1) / 2. 0 - i ),abs(n - 1) / 2.0 -j));
4,再考虑所得图形于实际结果相差值,这里我们依然设置(n + 1)/2
代码实现如下:
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
while(true){
int n = sc.nextInt() ;
for (int i = 0; i < n; i ++){
for(int j = 0; j < n ; j++){
if(n % 2 != 0){
System.out.print((n +1)/ 2 - Math.max(Math.abs(n /2 - i),Math.abs(n/2 - j))+ " ");
}else{
System.out.print((n +1)/ 2.0 - Math.max(Math.abs((n -1) /2.0 - i),Math.abs((n-1)/2.0 - j))+ " ");
}
}
System.out.println();
}
if(n == 0){
return;
}
System.out.println();
}
}
}
多种解法,如有错误,请多指教QWQ