hdu 3389 Game(Nim)

传送门

首先在纸上画了一下转移图:

1 3 4号盒子是不能够再转移卡片到其他盒子中去了的,其他盒子中的卡片经过若干步的转移最终也一定会转移到1 3 4号盒子中去。

具体来说,n % 6 == 0 或 2 或 5的盒子,经过奇数步转移到1 3 4中去,其他的则须经过偶数步才能转移过去。

 

下面来证明,所有卡片都在偶数步盒子中是必败状态

因为不论先手将偶数步的盒子中卡片移走了多少,后手一定可以把这些卡片再往前移动一个盒子,直到移到1 3 4中去为止。

 

对于只有一个盒子有卡片,而且这个盒子是奇数步盒子来说,先手必胜

很简单,根据上面的结论,只要先手把这个奇数步盒子中所有卡片全部往下移一个盒子就好了。这样就转移到了先手必败状态。

 

整个游戏可以看做若干个子游戏的和游戏,偶数步盒子不予考虑,只考虑奇数步盒子中的卡片,这就相当于一个n堆石子的Nim游戏。

在一个奇数步盒子中移走k张卡片,相当于在某一堆石子中取走k个石子。把所有石子取完相当于,所有的卡片都在偶数步的盒子里面,而我们已经证明完这种状态是必败状态了。

 

所以在代码中就只需要将奇数步盒子中的卡片数异或一下求个Nim和,就能判断胜负了。


#include<stdio.h>
using namespace std;

int main(){
	int Kase=1;
	int t;
	scanf("%d",&t);
	while(t--){
		int n;
		scanf("%d",&n);
		
		int ans=0;
		for(int i=1;i<=n;i++){
			int x;
			scanf("%d",&x);
			if(i%6==0||i%6==2||i%6==5)
			ans^=x;
		}
		printf("Case %d: ",Kase++);
		if(ans==0)printf("Bob\n");
		else printf("Alice\n");
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/l2533636371/article/details/80180874