篇四:回形数

/*回形数整体思路:
           * 步骤:
           * 1、请用户输入一个数n,然后获得该值的回形数
           * 2、观察回形数规律,可以拆分上下左右为四大部分,即分为四大部分分别输出,上下两大部分又分别拆分为奇数和偶数情况讨论。
           * 3、找出规律,其实沿着左上,右上,左下,右下对角线方向,它们沿着中心的数是有公式规律的
           *     这里以n=10为例子:那么int[][] =new int [x][y]=new int [10][10],输出的大概是以10×10的正方形
           *     以第一列和第一行为0,分别排序为:
           *       0   1   2   3   4  5   6   7   8   9  ----y(b)
           *   0 (1   2   3   4   5  6   7   8   9  10)          |
           *   1 36 (37  38  39  40  41  42  43  44)11          |
           *   2 35 64  (65  66  67  68  69  70) 45 12          |
           *   3 34 63   84 (85  86  87  88) 71  46 13          V列
           *   4 33 62   83  96 (97  98) 89  72  47 14
           *   5 32 61   82  95 |100 99| 90  73  48 15
           *   6 31 60   81 |94  93  92  91| 74  49 16
           *   7 30 59  |80  79  78  77  76  75| 50 17
           *   8 29 |58  57  56  55  54  53  52  51|18     
           *   9 |28 27  26  25  24  23  22  21  20 19|
           *   |
           *   |
           *   |
           *   x(a)------>行
                那么左上角沿着对角线到中心的规律为:4 * x(n - x) + 1,随着x=1,2,3,4……依次数为:1、37、65、85……
                那么右上角沿着对角线到中心的规律为:(1 + 4 * x)(n - x) - x;随着x=1,2,3……分别为:10、44、70、88
           *    那么左下角沿着对角线到中心的规律为:(4 * (n - x) - 1) * (n - (n - x)) + (n - x),随着x=9、8、7,分别为:  28、58、80……

           *    那么右下角沿着对角线到中心的规律为:(2 + 4 * (n - x - 1)) * (n - (n - x)) + 2(n - x) - 1,随着x=9、8、7,分别为:19、51、75
           *    以上的x均为行数。
           *   因此,我们要按照规律分别拆开来写代码,如上面括号地方为上半部分,|为下半部分,左右分别为左右两大部分
           *   由上半部分可以看到,(开始的地方是x=y的数字,末尾)的地方是n-x = y的地方
           *   而下半部分|开始的地方是(n - x - 1) =y的数字,末尾|的地方是x = y的地方
           *   
           *
           *对于奇数来说,其回形数中间剩一个数,对于偶数来说,其回形数中间剩一个环或0
           *4、写出代码:(本代码不涉及右下角规律,只涉及前三个规律)
           *
           */

/**
 * @author xiaocui
 * @date 2022年07月31日 9:33
 */
public class huixingshu {
        public static void main(String[] args) {
 
            Scanner scan=new Scanner(System.in);
            System.out.println("请输入一个值,我将为你输出该值下的回形数");//提示用户随机输入一个数
            int n = scan.nextInt();//获取回形数数值
            int[][]arry = new int[n][n];//二维数组为一个n * n的正方形
            int cycle = (n % 2 ==0)? n/2:(n+1)/2;//获取环数,奇数环数为(n+1)/2,偶数环数为n/2
            //上部分奇数
            int c = 0; //这里的c是留给后面循环条件+1试用的
            if(n % 2 != 0){  //若n为奇数,进入这个if循环
                for(int a = 0;a <= (n-1)/2;a++){  //这里的a相当于x,而(n-1)/2意思是奇数回形数的最大数在(n-1)/2行,这里等于号加不加都可以,这里不加的话就要在下部分的奇数加上,对于奇数回形数来说,左上和左下的规律在中间来说都是得到最大数!
                    for(int b = a;b < n - a;b++){ //这里的b相当于y,b = a即 x = y,对于第几行x,其相应括号结束的地方是n-x看不懂的话,看上面的分析
                        if(a == 0){  //a,b都从零开始
                            arry[0][b] = b + 1;//先把1 到n在第一行输出完了
                        }
                        else{

                            arry[a][b] = 4 * a *(n - a) + 1 + c; //再把其他行的也输出完,这里的c其+1作用,首个数字c是0,第二个c是1,
                            c++;

                        }
                    }
                    c = 0;//这里记得把c回0,不然会影响接下来其他部分的结果。
                }
            }
            //上部分偶数   //偶数和奇数的不同之处只是a的条件判断式子不同,其余一样
            if(n % 2 == 0){
                for(int a = 0;a <= n/2-1;a++){
                    for(int b = a;b < n - a;b++){
                        if(a == 0){
                            arry[0][b] = b + 1;
                        }
                        else{

                            arry[a][b] = 4 * a *(n - a) + 1 + c;
                            c++;

                        }
                    }
                    c = 0;
                }
            }
            //下部分奇数
            if(n % 2 != 0){
                for(int a = n - 1;a > (n-1)/2;a--){        //这里的条件判断看上面,如果上面没有等号这里记得加回,这里从最后一行开始往上输出
                    for(int b = n - a - 1;b < a + 1 ;b++){ //这里看不懂看上面分析,
                        arry[a][b] =(4 * (n - a) - 1) * a + n - a - c;//式子看解析,这里以左括号(第一个数字为起点,这里-c是因为下部分从左到右依次减一
                        c++;
                    }
                    c = 0;//赋值完记得归0
                }
            }
            //下部分偶数   ,这里和奇数的区别也就a的条件判断不同
            if(n % 2 == 0){
                for(int a = n - 1;a > n / 2 -1;a--){
                    for(int b = n - a - 1;b < a + 1 ;b++){
                        arry[a][b] =(4 * (n - a) - 1) * a + n - a - c;
                        c++;
                    }
                    c = 0;
                }
            }

            //左部分由下到上,列数为环数-1,即cycle-1
            for(int d = 1;d < cycle;d++){  //d为第几列,左边一共要补cycle - 1列,d等于n-a,d的意思就是从最后一行的第一个数开始往上的那一列
                for(int a = n - d - 1; a >= d;a--){ //a为行数x
                    arry[a][d-1] = (4 * d - 1) * (n - d) + 1 + d + c; //d-1意思为:例如:在补第一列的时候int[x][y]的y固定都是0,因此为d-1
                    //而+1的意思是在下部分赋值的第一个数的上一个数,这个数比它大1,并以此为起点,起点的数,c此时为0,往上依次加一
                    c++;
                }
                c = 0;
            }
            //右部分由上到下,列数同样为环数-1
            for(int d = 1;d < cycle;d++){  //d为第几列,左边一共要补cycle - 1列,思想和左部分相似,只不过右部分是从上往下依次加一,左部分是从下往上依次加一
                for(int a = d; a <= n - 1 - d;a++){
                    arry[a][n - d] = (1 + 4 * (d - 1)) * (n - (d - 1))  - (d - 1) + 1 + c;
                    c++;
                }
                c=0;
            }

            //输出一遍:
            for(int i = 0;i < n;i++){
                for(int j = 0;j < n;j++){
                    System.out.print(arry[i][j]+" ");
                }
                System.out.println();
            }

        }
}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
蓝桥杯是中国最具影响力的计算机竞赛之一,形取数是蓝桥杯中的一道经典题目。下面是关于Python实现形取数的介绍: 形取数是指从一个矩阵中按照形的方式依次取出所有的元素。具体来说,就是从矩阵的左上角开始,按照顺时针的方向依次取出元素,直到取完所有元素为止。 在Python中,可以通过嵌套列表来表示矩阵。下面是一个示例代码,实现了形取数的功能: ```python def spiral_order(matrix): if not matrix: return [] rows, cols = len(matrix), len(matrix[0]) top, bottom, left, right = 0, rows - 1, 0, cols - 1 result = [] while top <= bottom and left <= right: # 从左到右 for col in range(left, right + 1): result.append(matrix[top][col]) top += 1 # 从上到下 for row in range(top, bottom + 1): result.append(matrix[row][right]) right -= 1 if top <= bottom: # 从右到左 for col in range(right, left - 1, -1): result.append(matrix[bottom][col]) bottom -= 1 if left <= right: # 从下到上 for row in range(bottom, top - 1, -1): result.append(matrix[row][left]) left += 1 return result # 测试 matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] result = spiral_order(matrix) print(result) ``` 以上代码中,`spiral_order`函数接受一个二维列表作为输入,表示矩阵。函数通过设定上下左右个边界来控制取数的范围,然后按照顺时针的方向依次取出元素,并将其添加到结果列表中。最后返结果列表。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值