[TIOJ] 1088. [Interactive] 取石頭(二)
題目連結:http://tioj.infor.org/problems/1088
標準的nim遊戲。本題如果知道nim的玩法應該就秒解了,因為nim的遊戲方法就是讓所有數xor起來為零,因為當一個人拿到xor直為零的時候他必定沒辦法再讓版面的xor值為零,而且你也一定可已把盤面xor值弄成零,所以就看兩下吧XD
p.s附個我寫的lib1088.h
lib1088.h
1088.cpp
標準的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;
}
留言
張貼留言