连环锁 POJ - 1832(格雷码与二进制)

传送门

题意:给出九连环的两种状态,问第一种状态转化到第二种状态时至少需要多少步?

题解:这道题是与格雷码有关的题目,定义以及转化规则看这儿传送门

由于九连环仅限的两种操作(假设大家都玩过),所以用二进制表示下的相邻状态只有一个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());
		}
	}
}

猜你喜欢

转载自blog.csdn.net/zhouzi2018/article/details/84553917
今日推荐