解题思路:
不知道咋说,就一眼就能看出来怎么解。一个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 人评分
DNA (C++代码)浏览:671 |
C语言程序设计教程(第三版)课后习题10.1 (C语言代码)浏览:1516 |
校门外的树 (C语言代码)浏览:1166 |
C语言程序设计教程(第三版)课后习题11.3 (C语言代码)浏览:1059 |
C语言程序设计教程(第三版)课后习题6.7 (C语言代码)浏览:674 |
C语言程序设计教程(第三版)课后习题9.3 (Java代码)浏览:1025 |
人见人爱A+B (C语言代码)浏览:663 |
校门外的树 (C语言代码)浏览:988 |
WU-整除问题 (C++代码)浏览:648 |
剪刀石头布 (C语言代码)浏览:802 |