原题链接:蓝桥杯基础练习VIP-回形取数
解题思路:
代码注释
参考代码:
import java.util.Scanner;
/**
* @author Alex
* @date 2018/3/6
* 回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转90度。一开始位于矩阵左上角,方向向下。
*
* 四个方向用1,2,3,4代表上下左右
* 每次遇到边界就按1,2,3,4的顺序更换方向
* 边界由边界数组b决定
*/
public class Basic_25 {
public static void main(String[] args) {
//初始化
int m, n;
int i, j;
int[][] a = new int[250][250];
Scanner scanner = new Scanner(System.in);
boolean [][] b = new boolean[250][250];
m = scanner.nextInt();
n = scanner.nextInt();
for (i = 1; i <= m; i++) {
for (j = 1; j <= n; j++) {
a[i][j] = scanner.nextInt();
}
}
//边界数组,题目没有指明是正整数
for (i = 0;i <= m + 1; i ++){
b[i][0] = true;
b[i][n + 1] = true;
}
for (i = 0; i <= n + 1; i ++){
b[0][i] = b[m + 1][i] = true;
}
//回形取数
//记录总数
int count = 0;
//当前点的上一个点
int tmpI = 0,tmpJ = 0;
//方向
int direction = 1;
//起点
i = 0;
j = 1;
while (count < m * n) {
switch (direction % 4) {
case 1:
i++;
break;
case 2:
j++;
break;
case 3:
i--;
break;
case 0:
j--;
break;
}
//当走到边界的时候还原上一步
if(b[i][j]){
direction ++;
i = tmpI;
j = tmpJ;
continue;
}
System.out.print(a[i][j] + " ");
tmpI = i;
tmpJ = j;
count ++;
b[i][j] = true;
}
}
}0.0分
3 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复