跑得快
阿新 • • 發佈:2018-11-15
#include<bits/stdc++.h> using namespace std; #define debug(x) cout<<"< "#x" = "<<x<<" >"<<endl const int maxn=1e2; int a[maxn],p1[15],p2[15],p1_cnt[15],p2_cnt[15]; int order[15]={0,3,4,5,6,7,8,9,10,11,12,13,1,2},inv_order[15]={0,12,13,1,2,3,4,5,6,7,8,9,10,11}; int num,p1_left,p2_left; vector<int> bomb,pairs,single; vector<pair<int,int> > straight,aaab,aaabb; void shuffle(int a[],int lft,int rgt) { for(int i=lft;i<rgt;++i) { int p=rand()%(rgt-i)+i; swap(a[i],a[p]); } } bool cmps(pair<int,int> a,pair<int,int> b) { return (a.second<b.second)||((a.first<b.first)&&(a.second==b.second)); } bool cmpa(pair<int,int> a,pair<int,int> b) { return a.first<b.first; } void init() { srand((unsigned)time(NULL)); //deal for(int i=1;i<=13;++i) { for(int j=1;j<=4;++j) { a[4*i+j-4]=i; } } shuffle(a,1,53); p1_left=p2_left=num=15;//num<=26 memset(p1,0,sizeof p1); memset(p2,0,sizeof p2); memset(p1_cnt,0,sizeof p1_cnt); memset(p2_cnt,0,sizeof p2_cnt); for(int i=1;i<=num;++i)p1[a[i]]++,p1_cnt[a[i]]++,p2[a[i+num]]++,p2_cnt[a[i+num]]++; //record bomb.clear(); pairs.clear(); single.clear(); straight.clear(); aaab.clear(); //bomb; for(int i=1;i<=13;++i) { if(p2[i]==4) { bomb.push_back(i); p2[i]=0; } } //straight int cnt=0; for(int i=1;i<=13;++i) { if(p2[i]&&i<13)cnt++; else if(cnt>=5) { i=i-cnt-1; straight.push_back(make_pair(i+1,cnt)); for(int j=0;j<cnt;++j)p2[i+j+1]--; cnt=0; } else cnt=0; } sort(straight.begin(),straight.end(),cmps); //aaab for(int i=13;i>0;--i) { if(p2[i]==3) { bool flag=true; for(int j=1;j<=13;++j) { if(p2[j]==1) { p2[j]=0; aaab.push_back(make_pair(i,j)); flag=false; break; } } if(flag) { for(int j=1;j<=13;++j) { if(p2[j]==2) { p2[j]=0; aaabb.push_back(make_pair(i,j)); flag=false; break; } } } if(flag) { for(int j=1;j<=13;++i) { if(p2[j]>0) { p2[j]--; aaab.push_back(make_pair(i,j)); flag=false; break; } } } if(!flag)p2[i]=0; } } sort(aaab.begin(),aaab.end(),cmpa); sort(aaabb.begin(),aaabb.end(),cmpa); //pairs for(int i=1;i<=13;++i) { if(p2[i]>=2) { pairs.push_back(i); p2[i]-=2; } } //single for(int i=1;i<=13;++i) { if(p2[i])single.push_back(i); } } int take(vector<int> &v,int n) { int sz=v.size(),ret=v[n]; static int c[maxn]; for(int i=0;i<sz;++i) { if(i==n)continue; c[i]=v[i]; } v.clear(); for(int i=0;i<sz;++i) { if(i==n)continue; v.push_back(c[i]); } return ret; } pair<int,int> take(vector<pair<int,int> > &v,int n) { int sz=v.size(); pair<int,int> ret=v[n]; static pair<int,int> c[maxn]; for(int i=0;i<sz;++i) { if(i==n)continue; c[i]=v[i]; } v.clear(); for(int i=0;i<sz;++i) { if(i==n)continue; v.push_back(c[i]); } return ret; } bool play(int id,int a,int b) { int sz; if(id==0) { if(p1_left>=5) for(int i=6;i>=1;--i) { if(play(i,0,0)) { return true; } } else for(int i=1;i<=6;++i) { if(play(i,0,0)) { return true; } } } else if(id==1) { sz=bomb.size(); if(sz==0)return false; for(int i=0;i<sz;++i) { if(bomb[i]>a) { p2_cnt[bomb[i]]-=4; printf("Your opponent play %d %d %d %d\n",order[bomb[i]],order[bomb[i]],order[bomb[i]],order[bomb[i]]); take(bomb,i); p2_left-=4; return true; } } } else if(id==2) { sz=straight.size(); if(sz==0)return false; if(b==0) { int sta=straight[0].first,len=straight[0].second; for(int i=0;i<len;++i)p2_cnt[sta+i]--; take(straight,0); p2_left-=len; printf("Your opponent play ");for(int i=0;i<len;++i)printf("%d ",order[sta+i]);printf("\n"); return true; } else { for(int i=0;i<sz;++i) { if(straight[i].second==b&&straight[i].first>a) { for(int j=0;j<b;++j)p2_cnt[straight[i].first+j]--; p2_left-=b; printf("Your opponent play ");for(int j=0;j<b;++j)printf("%d ",order[straight[i].first+j]);printf("\n"); take(straight,i); return true; } } } } else if(id==3) { sz=aaabb.size(); if(sz==0)return false; for(int i=0;i<sz;++i) { if(aaabb[i].first>a) { p2_cnt[aaabb[i].first]-=3; p2_cnt[aaabb[i].second]-=2; printf("Your opponent play %d %d %d %d %d\n",order[aaabb[i].first],order[aaabb[i].first],order[aaabb[i].first],order[aaabb[i].second],order[aaabb[i].second]); p2_left-=5; take(aaabb,i); return true; } } } else if(id==4) { sz=aaab.size(); if(sz==0)return false; for(int i=0;i<sz;++i) { if(aaab[i].first>a) { p2_cnt[aaab[i].first]-=3; p2_cnt[aaab[i].second]-=1; printf("Your opponent play %d %d %d %d\n",order[aaab[i].first],order[aaab[i].first],order[aaab[i].first],order[aaab[i].second]); p2_left-=4; take(aaab,i); return true; } } } else if(id==5) { sz=pairs.size(); if(sz==0)return false; for(int i=0;i<sz;++i) { if(pairs[i]>a) { p2_cnt[pairs[i]]-=2; printf("Your opponent play %d %d\n",order[pairs[i]],order[pairs[i]]); p2_left-=2; take(pairs,i); return true; } } } else if(id==6) { sz=single.size(); if(sz==0)return false; for(int i=0;i<sz;++i) { if(single[i]>a) { p2_cnt[single[i]]--; printf("Your opponent play %d\n",order[single[i]]); p2_left-=1; take(single,i); return true; } } } return false; } int main() { init(); /* for(int i=0;i<bomb.size();++i)printf("%d ",bomb[i]);printf("\n"); for(int i=0;i<straight.size();++i)printf("(%d,%d) ",straight[i].first,straight[i].second);printf("\n"); for(int i=0;i<aaabb.size();++i)printf("(%d,%d) ",aaabb[i].first,aaabb[i].second);printf("\n"); for(int i=0;i<aaab.size();++i)printf("(%d,%d) ",aaab[i].first,aaab[i].second);printf("\n"); for(int i=0;i<pairs.size();++i)printf("%d ",pairs[i]);printf("\n"); for(int i=0;i<single.size();++i)printf("%d ",single[i]);printf("\n"); //getchar(); */ int id,a,b; id=a=b=0; while(1) { if(!play(id,a,b))printf("Your opponent skips\n"); printf("(He has %d cards left...)\n\n",p2_left); if(p2_left==0) { printf("You lose!\n"); break; } /* printf("Your opponent's cards : "); for(int i=1;i<=13;++i) { for(int j=1;j<=p2_cnt[i];++j)printf("%d ",order[i]); } */ printf("\nYour cards : "); for(int i=1;i<=13;++i) { for(int j=1;j<=p1[i];++j)printf("%d ",order[i]); } printf("\n\nPlay : "); vector<int> in; in.clear(); int n,tmp; scanf("%d",&n); if(n==0) { id=a=b=0; system("cls"); continue; } for(int i=1;i<=n;++i)scanf("%d",&tmp),in.push_back(inv_order[tmp]),p1[inv_order[tmp]]--; if(in.size()==1) { p1_left--; id=6,a=in[0]; } else if(in.size()==2) { p1_left-=2; id=5,a=in[0]; } else if(in.size()==4) { p1_left-=4; if(in[0]==in[3])id=1,a=in[0]; else id=4,a=in[0],b=in[3]; } else if(in.size()==5) { p1_left-=5; if(in[0]!=in[1])id=2,a=in[0],b=5; else id=3,a=in[0],b=in[3]; } else { p1_left-=in.size(); id=1,a=in[0],b=in.size(); } if(p1_left==0) { printf("You win\n"); break; } system("cls"); } }