回字形矩阵

题目描述:

输入整数 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 2 2
1 2 3 3
1 2 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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值