發表文章

目前顯示的是有「SG Value」標籤的文章

[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...

[TIOJ] 1087. [Interactive] 取石頭(一)

題目連結: http://tioj.infor.org/problems/1087 經典的NIM題,可以用SG Value發現本題先手必勝,但要怎麼玩呢??,不難發現若且為若對方的盤面SG值為0他就輸了,因此我只要想辦法構造讓對方的三堆石頭xor起來是0,特別的是當剩兩堆且一堆為一時,顯然我們只要把那堆不為0的拿走就好了,而剩一堆時顯然把那堆拿到剩一就好了,所以記得特判一下 #include "lib1087.h" int stone[] = {10,15,20}; inline bool all0(); inline bool only1(int); int main(){ Initialize(); while(!all0()){ for(int i=0;i<3;i++){ int cnt,pile; if(stone[0]+stone[1]==1){ Take_Stone(3, stone[2], &pile, &cnt); stone[2]=0; stone[pile-1]-=cnt; break; }else if(stone[0]+stone[2]==1){ Take_Stone(2, stone[1], &pile, &cnt); stone[1]=0; stone[pile-1]-=cnt; break; }else if(stone[1]+stone[2]==1){ Take_Stone(1, stone[0], &pile, &cnt); stone[...