资讯专栏INFORMATION COLUMN

二维数组的旋转赋值(递归)

kun_jian / 1127人阅读

摘要:如图所示图片描述输出结果输入二维数组长度创建二维数组赋值遍历所赋的值控制转向为右为下为左为上纪录函数调用次数若超出数组转向若当前点没有走过赋值输出到最后一个数跳出循环转向向右走向下走向左走向上走循环转向

描述

给定一个h行h列的整数数组array,要求从array[0][0]元素开始,按回形从外向内顺时针顺序赋值整个数组。如图所示:
![图片描述][1]
输出结果:4 4
    1  2  3  4
    12 13 14 5
    11 16 15 6
    10 9  8  7

public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int h = scanner.nextInt();//输入二维数组长度
        int[][] arr = new int[h][h];//创建二维数组
        setWay(arr,0,0);//赋值
        for (int[] p : arr) {//遍历
            for (int p1 : p) {
                System.out.printf("%-4d",p1);
            }
            System.out.println();
        }
        System.out.println(t);
    }
    static int p = 1;//所赋的值
    static int f = 0;//控制转向  0为右 1为下 2为左 3为上
    static int t = 0;//纪录函数调用次数
    public static boolean setWay(int[][]map,int i,int j){

            if(i==map.length || j ==map.length || i == -1 || j == -1){//若超出数组
                f = (f+1)%4;//转向
                t++;
                return false;
            }

            if (map[i][j] == 0) {// 若当前点没有走过
                map[i][j] = p;//赋值
                p++;
                while(p != map.length*map.length+1)//输出到最后一个数跳出循环转向
                    switch(f){
                    case 0:
                        if (setWay(map, i, j + 1)) {//向右走
                            return true;
                        }
                        break;
                    case 1:
                        if (setWay(map, i+1, j )) {// 向下走
                            return true;
                        }
                        break;
                    case 2:
                        if (setWay(map, i , j-1)) {// 向左走
                            return true;
                        } 
                        break;
                    case 3:
                         if (setWay(map, i-1, j)) {// 向上走
                                return true;
                            }
                        break;
                    }
            }
            f = (f+1)%4;//循环转向
            t++;
            return false;
    }

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/77877.html

相关文章

  • C语言第三期(1万字函数-数组-操作符详解)

    摘要:形式参数当函数调用完成之后就自动销毁了。函数调用传值调用函数的形参和实参分别占有不同内存块,对形参的修改不会影响实参。函数的声明一般出现在函数的使用之前。它其实就数组访问的操作符。 ...

    Jeff 评论0 收藏0
  • 21-11-23

    摘要:这里执行是错误的,这样赋值也是错误的因为是个不可知的表示,只存在而且它们分别是指针变量可以用来存放变量地址。 数组 1、数组认知: a、静态分配空间(int a[1...

    不知名网友 评论0 收藏0
  • TypeScript实现数组相关简单算法

    摘要:本文只是简单理解算法,并不会深入的讨论。大部分来自数组部分。如果数组中每个元素都不相同,则返回。示例输入输出加给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。尽量减少操作次数。 算法(algorithm),在数学(算学)和计算机科学之中,为任何良定义的具体计算步骤的一个序列,常用于计算、数据处理和自动推理。精确而言,算法是一个表示为有限长列表的有效方法。算法应包含清晰...

    cloud 评论0 收藏0
  • LeetCode 精选TOP面试题【51 ~ 100】

    摘要:有效三角形的个数双指针最暴力的方法应该是三重循环枚举三个数字。总结本题和三数之和很像,都是三个数加和为某一个值。所以我们可以使用归并排序来解决这个问题。注意因为归并排序需要递归,所以空间复杂度为 ...

    Clect 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<