ZJNU 1534 - Problem Robot--高级
Posted stelayuri
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ZJNU 1534 - Problem Robot--高级相关的知识,希望对你有一定的参考价值。
因为是从(0,0)点开始以1,3,9,27,....的步数走的
其实可以每走一步后,以机器人为中心,平面所有坐标全部缩小3倍
那么本应该走3步的路现在只需要走1步就可以到达那个点
那么对于机器人来说这种变化意味着什么
走一步,缩小3倍,再走一步,再缩小3倍
以原点(0,0)为参照物,机器人走的距离确实是以1,3,9,27,...递增的
但是以机器人为参照物的话,每次它都只走了1步
然后,考虑在某个时刻,机器人和它的目标坐标(x,y)的相对坐标距离为(Δx,Δy)
因为接下来机器人要走的步数是1,3,9,...
因为有1的出现,所以Δx和Δy不可能同时是3的倍数,也不可能都不是3的倍数
如果出现了这种情况,直接输出Impossible
其余的,因为每次都会让接下来要走的步数/3
可能会出现类似-1-3+9的情况
这种情况下如果按照思路应该是-1/3-3/3+9/3=-1+3=2
但是如果直接进行整除
(-1-3+9)/3=5/3=1
不符合思路
所以需要将%3时先后为2,0,1的数归在一起
C语言的程序主要功能描述如下
1 x=abs(x); 2 y=abs(y); 3 while(x>0||y>0){ 4 if(x%3==0&&y%3==0||x%3&&y%3) 5 break; 6 x=(x+1)/3; 7 y=(y+1)/3; 8 }
但是题目数据范围在1e500内
需要开高精度或者使用Python或Java
下面展示Java程序作为参考
1 /* 2 Written By StelaYuri 3 */ 4 import java.util.Scanner; 5 import java.math.BigInteger; 6 public class Main 7 { 8 public static void main(String[] args) 9 { 10 Scanner in=new Scanner(System.in); 11 BigInteger a=new BigInteger(in.next()).abs(),b=new BigInteger(in.next()).abs(),j1,j2; 12 BigInteger c0=BigInteger.ZERO,c1=BigInteger.ONE,c2=new BigInteger("2"),c3=new BigInteger("3"); 13 boolean jd=true; 14 while(jd&&(a.compareTo(c0)!=0||b.compareTo(c0)!=0)){ 15 j1=a.remainder(c3); 16 j2=b.remainder(c3); 17 if((j1.compareTo(c0)==0)==(j2.compareTo(c0)==0)){ 18 jd=false; 19 break; 20 } 21 a=a.add(c1).divide(c3); 22 b=b.add(c1).divide(c3); 23 } 24 if(jd) 25 System.out.println("Possible "); 26 else 27 System.out.println("Impossible "); 28 } 29 }
以上是关于ZJNU 1534 - Problem Robot--高级的主要内容,如果未能解决你的问题,请参考以下文章