当前位置: 代码迷 >> 综合 >> 【模拟与高精度】【JAVA】P1563 [NOIP2016 提高组] 玩具谜题
  详细解决方案

【模拟与高精度】【JAVA】P1563 [NOIP2016 提高组] 玩具谜题

热度:9   发布时间:2023-12-01 15:06:45.0

点击原题目

题意:模拟寻找眼镜的过程,通过小人的面向和提供的指令寻找眼镜。
思路:

存放数据通过两个String数组实现 通过题上给出的条件可以总结以下结论
1.小人朝向圈内,左边是顺时针方向
2.小人朝向圈内,右边是逆时针方向
3.小人朝向圈外,左边是顺时针方向
4.小人朝向圈外,右边是逆时针方向
寻找眼镜的指令就这四种情况,但是通过观察可以发现,其中的1、3可以合并2、4也可以合并 这样就是两种情况了。
1.圈内左边和圈外右边为顺时针,也就是小人朝向为0指令为0 和小人朝向为1 指令为1
2.圈内右边和圈外左边为逆时针 0 1和1 0
条件判断已经有了,接下来就是如何处理数据 因为数组的下标从0开始,而小人的位置是从1开始,所以这里为了统一,就把小人的位置也从0开始

对于顺时针移动的理解:倒着走i个单位,相当于正着走n-i个单位,把当前位置结合起来就是(当前位置+n-i)
顺时针:(当前指向小人的位置+小人个数-移动长度)% 小人个数
逆时针:(当前小人位置+移动长度)%小人个数

package LOQ.模拟与高精度;import java.util.Scanner;public class P1563_2 {
    public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);int n = sc.nextInt(), m = sc.nextInt();String[] pepos = new String[n]; //小人个数及朝向String[] orders = new String[m];  //指令sc.nextLine();  //吃掉回车符int index = 0;    //记录当前指向小人坐标for (int i = 0; i < n; i++) {
    pepos[i] = sc.nextLine();}for (int i = 0; i < m; i++) {
    orders[i] = sc.nextLine();}for (int i = 0; i < m; i++) {
    String[] temp = pepos[index].split(" ");  //从第一个小人开始String[] order = orders[i].split(" ");    //获取指令//顺时针if ((order[0].equals("0") && temp[0].equals("0")) || (order[0].equals("1") && temp[0].equals("1"))) {
    index = (index + n - Integer.parseInt(order[1])) % n;} else {
        //逆时针index = (index + Integer.parseInt(order[1])) % n;}}String[] res = pepos[index].split(" ");System.out.println(res[1]);}
}
  相关解决方案