Game of Cards Gym - 102822G
生活随笔
收集整理的這篇文章主要介紹了
Game of Cards Gym - 102822G
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
Game of Cards Gym - 102822G
題意:
小兔子和小馬喜歡玩奇怪的紙牌游戲。現(xiàn)在,他們正在玩一種叫做0123游戲的紙牌游戲。桌子上有幾張牌。其中c0標記為0,c1標記為1,c2標記為2,c3標記為3。小兔子和小馬輪流玩游戲,小兔子先走。在每一回合中,玩家應(yīng)選擇兩張牌,條件是兩張牌上的數(shù)字之和不超過3,然后將這兩張牌換成標有其和的牌。不能移動的玩家將輸?shù)舯荣悺P⊥米雍托●R在想誰會贏這場比賽
c0, c1, c2, c3 (0 <= c0, c1, c2, c3 <= 1e9)
題解:
題目的數(shù)據(jù)范圍就說明了這個題用記憶化搜索+sg函數(shù)無法做出,這么大的范圍說明是個找規(guī)律題
這種題貌似只能枚舉出所有的情況:
參考題解
這篇文章分析講解的非常到位,這種題我還是沒有經(jīng)驗
我感覺關(guān)鍵地方在于兩個1可以得到一個2,2又可以和一個1合成3,相當于這一趟1牌少了3個,但是對方度過一輪,所以要考慮c1%3的情況(c1為1牌的數(shù)量)
代碼:
我一開始寫的打表sg()代碼
#include<bits/stdc++.h> #define debug(a,b) printf("%s = %d\n",a,b); typedef long long ll; using namespace std;inline int read(){int s=0,w=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();//s=(s<<3)+(s<<1)+(ch^48);return s*w; }int sg[22][22][22][22]; int check(int a,int b,int c,int d){if(sg[a][b][c][d]!=-1)return sg[a][b][c][d];if(a==0&&b==0)return sg[a][b][c][d]=0;int vis[10300];memset(vis,0,sizeof(vis));if(a>=2)vis[check(a-1,b,c,d)]=1;if(b>=2)vis[check(a,b-2,c+1,d)]=1;if(a>=1&&c>=1)vis[check(a-1,b,c,d)]=1;if(a>=1&&d>=1)vis[check(a-1,b,c,d)]=1;if(b>=1&&c>=1)vis[check(a,b-1,c-1,d+1)]=1;for(int i=0;i<10300;i++){if(!vis[i])return sg[a][b][c][d]=i;} }int main() {int t;int cas=0;memset(sg,-1,sizeof(sg));for(int a=0;a<=10;a++)for(int b=0;b<=10;b++)for(int c=0;c<=10;c++)for(int d=0;d<=12;d++){printf("Case #%d: a=%d,b=%d,c=%d,d=%d ",++cas,a,b,c,d);if(check(a,b,c,d))puts("Rabbit");else puts("Horse");} }根據(jù)規(guī)律得到的正解
#include <bits/stdc++.h> using namespace std; const int maxn=1e5; #define ll long long int check(int a[5]) {if (a[1]==0 && a[2]==0)//只有0和3{if (a[3]==0){if (a[0]%2==1 || a[0]==0)return -1;}else if (a[0]%2==0){return -1;}return 1;}if (a[0]%2==0){if (a[1]%3==0){return -1;}if (a[1]%3==1 && a[2]==0){return -1;}}else{if (a[1]%3==1 && a[2]>0){return -1;}if (a[1]%3==2 && a[2]<=1){return -1;}}return 1; } int main() {int t, tot=0;scanf("%d", &t);while(t--){int a[5];scanf("%d%d%d%d", &a[0], &a[1], &a[2], &a[3]);if (check(a)==1){printf("Case #%d: Rabbit\n", ++tot);}else{printf("Case #%d: Horse\n", ++tot);}} }總結(jié)
以上是生活随笔為你收集整理的Game of Cards Gym - 102822G的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 新网邮箱怎么登陆(新网邮箱怎么登陆手机)
- 下一篇: CF 1529C Parsa‘s Hum