原题链接:蓝桥杯2014年第五届真题-兰顿蚂蚁
解题思路:
不知道咋说,就一眼就能看出来怎么解。一个for解决。搞好字典序的顺序就行
注意事项:
这道题坑人的地方就是 x y 的输入,按照正常人的逻辑应该是 x为列,y为行,但是这道题的数据输入变成了x为行,y为列,这一块需要注意。
还有就是这道题说了x和y都是已0作为起点的,所以不需要考虑数组下标从哪里开始。
参考代码:
import java.util.Scanner;
public class Main{
// 题目地址:https://www.dotcpp.com/oj/problem1429.html
// 需要注意,我的方向是有排列顺序的上->右->下->左 对应右转。反之对应左转。
private static final String direction = "URDL";
// 不同转的方向,进行的位置数值的变动
private static final int[] pos_x = {0, 1, 0, -1};
private static final int[] pos_y = {-1, 0, 1, 0};
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int m = scanner.nextInt(), n = scanner.nextInt();
int x, y, k;
char s;
int[][] grid = new int[m][n];
// 输入
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
grid[i][j] = scanner.nextInt();
}
}
x = scanner.nextInt();
y = scanner.nextInt();
s = scanner.next().toCharArray()[0];
k = scanner.nextInt();
// 已步数来循环
for (int i = 0; i < k; i++) {
// 转向
s = spin(grid[x][y], s);
// 改变但前格的颜色
grid[x][y] = grid[x][y] == 0 ? 1 : 0;
// 获取方向的下标
int s_direction = direction.indexOf(s);
// 进行方向操作
// 这里就是需要注意的,x y 此时的逻辑是相反的
int x1 = x + pos_y[s_direction];
int y1 = y + pos_x[s_direction];
// 是否越界
if(x1 >= 0 && y1 >= 0 && x1 < n && y1 < m){
x = x1;
y = y1;
}
}
// 输出 x y
System.out.println(x + " " + y);
}
// 旋转,并返回旋转后的位置
public static char spin(int a, char nowDirection) {
// 获取到当前方向在字典序中的位置
int pos = direction.indexOf(nowDirection);
// 白格 左转
if (a == 0) {
// 左转则字典序往前一位
pos--;
// 特殊考虑如果到了第一个,则跳到字典序的最后一个位置
if (pos < 0) {
pos = 3;
}
// 黑格 右转
} else {
// 右转则字典序往后一位
pos++;
// 特殊考虑如果到了最后一个,则回到字典序的第一个位置
if (pos > 3) {
pos = 0;
}
}
// 放回一下获取到的新方向
return direction.toCharArray()[pos];
}
}0.0分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复