解题思路:如何转向,什么条件下转向,
注意事项:只是记录下代码
参考代码:
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 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复