[TIOJ] 1088. [Interactive] 取石頭(二)

題目連結:http://tioj.infor.org/problems/1088
標準的nim遊戲。本題如果知道nim的玩法應該就秒解了,因為nim的遊戲方法就是讓所有數xor起來為零,因為當一個人拿到xor直為零的時候他必定沒辦法再讓版面的xor值為零,而且你也一定可已把盤面xor值弄成零,所以就看兩下吧XD
p.s附個我寫的lib1088.h
lib1088.h
#include <cstdio>

int __stones[3];
void Initialize(int *a,int *b,int *c){
	printf("How many stones:");
	scanf("%d%d%d",a,b,c);
	__stones[0]=*a;__stones[1]=*b;__stones[2]=*c;
}
void Take_Stone(int pile_no, int num, int *com_pile, int *com_num){
	__stones[pile_no-1]-=num;
	printf("Now: ");
	for(int i=0;i<3;i++) printf("%d ",__stones[i]);
	puts("");	
	bool flag=1;
	for(int i=0;i<3;i++)
		if(__stones[i]>0)flag=0;
	if(flag){
		puts("You Lose!");
		exit(0);
	}
	printf("Chosse and sum:");
	scanf("%d%d",com_pile, com_num);
	__stones[(*com_pile)-1]-=(*com_num);
	for(int i=0;i<3;i++) printf("%d ",__stones[i]);
	puts("");
}

1088.cpp
#include "lib1088.h"

int ss[3];

int main(){
	Initialize(&ss[0], &ss[1], &ss[2]);
	while(true){
		int npc_num, npc_count;
		if((ss[0]^ss[1]) < ss[2]){
			Take_Stone(3, ss[2]-(ss[0]^ss[1]), &npc_num, &npc_count);
			ss[2]=ss[0]^ss[1];
		}else if((ss[1]^ss[2]) < ss[0]){
			Take_Stone(1, ss[0]-(ss[1]^ss[2]), &npc_num, &npc_count);
			ss[0]=ss[1]^ss[2];
		}else if((ss[2]^ss[0]) < ss[1]){
			Take_Stone(2, ss[1]-(ss[2]^ss[0]), &npc_num, &npc_count);
			ss[1]=ss[2]^ss[0];
		}
		ss[npc_num-1]-=npc_count;
	}
	return 0;
}

留言

這個網誌中的熱門文章

[TIOJ] 1094. C.幼稚國王的獎賞

[IOJ] 19. 啦啦啦

[IOJ] 14. 費氏數列問題