解题思路:如何转向,什么条件下转向,

注意事项:只是记录下代码

参考代码:

public class id1465 {

public static void main(String[] args) {

Scanner sc = new Scanner(System.in);

int n = sc.nextInt();

int m = sc.nextInt();

//数组只取中间部分,其他光报错,555

int[][] a = new int [n+2][m+2];

//b数组表示矩阵是否已经走过

//b[i][j]==1表示走过了,b[i][j]==0表示没走过了

int[][] b = new int [n+2][m+2];

//矩阵一共n*m个数,全放到f数组中

int[] f = new int [n*m];

//方向变化

int[][] c = {{-1,0},{0,1},{1,0},{0,-1}};

//输入矩阵

for (int i = 1; i <= n; i++) {

    for (int j = 1; j <= m; j++) {

        a[i][j] = sc.nextInt();

    }

}

sc.close();

//k表示,f中放了多少个数了,f数组从0开始

int k = 0;

//l表示方向,初始方向向下,l为2

int l = 2;

//i,j初始位置

int i=1,j=1;

while (k!=n*m) {

    //方向变换条件:

    //这一步已走过了或超界

    if (b[i][j]==1||i>n||i<=0||j>m||j<=0) {

        //判断需要变化方向后,回到上一步

        i-=c[l][0];

        j-=c[l][1];

        //变化方向

        l--;

        if (l==-1) {

            l = 3;

        }

        //i,j走一步

        i+=c[l][0];

        j+=c[l][1];

    }

    //不用变化方向

    if (b[i][j]==0) {

        //f数组中加入数据

            f[k] = a[i][j];

        //b数组更改为走过了

            b[i][j] = 1;

        //i,j走一步

        i+=c[l][0];

        j+=c[l][1];

        //

        k++;

        }

    }

    for (int j2 = 0; j2 < f.length-1; j2++) {

        System.out.print(f[j2]+" ");

    }

    System.out.println(f[f.length-1]);

    }

}

点赞(0)
 

0.0分

0 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论