题意:给出九连环的两种状态,问第一种状态转化到第二种状态时至少需要多少步?
题解:这道题是与格雷码有关的题目,定义以及转化规则看这儿传送门
还有个好的视频解说传送门
由于九连环仅限的两种操作(假设大家都玩过),所以用二进制表示下的相邻状态只有一个1的差别,所以此时的状态就是所谓的格雷码,而转化好的二进制就是所谓的这种状态到环全部下下的状态的步数,所以这道题也就是将这两个的格雷码转化好的二进制算出来,差值的绝对值即为答案,由于数据范围128,直接用JAVA的大数包进行解决。
附上代码:
import java.util.*;
import java.math.BigInteger;
public class Main{
public static void main(String []args) {
Scanner cin=new Scanner(System.in);
int m=cin.nextInt();
while(m-->0) {
int n=cin.nextInt();
BigInteger a=new BigInteger("0"),b=new BigInteger("0");
for(int i=0;i<n;i++) {
if(cin.nextInt()==0) {
a=a.multiply(BigInteger.valueOf(2)).add(a.mod(BigInteger.valueOf(2)));
}else {
a=a.multiply(BigInteger.valueOf(2)).add(BigInteger.valueOf(1)).subtract(a.mod(BigInteger.valueOf(2)));
}
}
for(int i=0;i<n;i++) {
if(cin.nextInt()==0) {
b=b.multiply(BigInteger.valueOf(2)).add(b.mod(BigInteger.valueOf(2)));
}else {
b=b.multiply(BigInteger.valueOf(2)).add(BigInteger.valueOf(1)).subtract(b.mod(BigInteger.valueOf(2)));
}
}
System.out.println(a.subtract(b).abs());
}
}
}