Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
此题数据有问题~1 15 6 9 9 10 4 7 3 6 5 8 8 9 6 10 4 8 4 5 2 3 5 9 7 8 2 5 5 6 2 4 对于如下ac程序输出是B获胜,但显然是A获胜~ #include<cstdio> #include<map> #include<cstring> #include<cmath> #include<vector> #include<queue> #include<algorithm> #include<set> #define inf (1ull<<63)-1 #define N 50005 #define maxn 100005 #define Min(a,b) ((a)<(b)?(a):(b)) #define Max(a,b) ((a)>(b)?(a):(b)) #define pb(a) push_back(a) #define mem(a,b) memset(a,b,sizeof(a)) #define eps 1e-9 #define zero(a) fabs(a)<eps #define LL long long #define ULL unsigned long long #define lson (step<<1) #define rson (step<<1|1) #define MOD 1000000007 #define mp(a,b) make_pair(a,b) using namespace std; //10个顶点之间的连线编号 int mat[11][11]={ {0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,1,0,0,0,0,0,0,0}, {0,0,0,2,3,4,0,0,0,0,0}, {0,1,2,0,0,5,6,0,0,0,0}, {0,0,3,0,0,7,0,9,10,0,0}, {0,0,4,5,7,0,8,0,11,12,0}, {0,0,0,6,0,8,0,0,0,13,14}, {0,0,0,0,9,0,0,0,15,0,0}, {0,0,0,0,10,11,0,15,0,16,0}, {0,0,0,0,0,12,13,0,16,0,17}, {0,0,0,0,0,0,14,0,0,17,0} }; //9个三角形组成的边状态压缩一下 int tri[9]={7,152,52,352,34304,3200,71680,12544,155648}; int STATUS=(1<<18)-1; int Get_Status(int old,int seg,int &cnt){ int now=old|seg; for(int i=0;i<9;i++){ //之前不包含这个三角形,现在包含了 if((old&tri[i])!=tri[i]&&(now&tri[i])==tri[i]) cnt++; } return now; } int MaxSearch(int state,int alpha,int ca,int cb); int MinSearch(int state,int beta,int ca,int cb){ //出现5个三角形,胜负已分 if(ca>=5) return 1; if(cb>=5) return -1; //所有的边都取了,游戏也结束 if(state==STATUS) return ca>cb?1:-1; int ans=1; int remain=(~state)&STATUS; //剩下还有哪些边可以取 while(remain){ int seg=remain&(-remain); //枚举 int ta=ca,tb=cb; int now=Get_Status(state,seg,tb),tmp; //是否有新的三角形生成 if(tb>cb) tmp=MinSearch(now,beta,ca,tb); else tmp=MaxSearch(now,ans,ca,tb); if(tmp<ans) ans=tmp; //beta剪枝(其实与pdf写的alpha-beta剪枝反了) if(tmp<=beta) return ans; remain-=seg; } return ans; } int MaxSearch(int state,int alpha,int ca,int cb){ //出现5个三角形,胜负已分 if(ca>=5) return 1; if(cb>=5) return -1; //所有的边都取了,游戏也结束 if(state==STATUS) return ca>cb?1:-1; int ans=-1; int remain=(~state)&STATUS; //剩下还有哪些边可以取 while(remain){ int seg=remain&(-remain); //枚举 int ta=ca,tb=cb; int now=Get_Status(state,seg,ta),tmp; //是否有新的三角形生成 if(ta>ca) tmp=MaxSearch(now,alpha,ta,cb); else tmp=MinSearch(now,ans,ta,cb); if(tmp>ans) ans=tmp; //alpha剪枝 if(tmp>=alpha) return ans; remain-=seg; } return ans; } int main(){ freopen("D:\\input.txt","r",stdin); // freopen("D:\\output2.txt","w",stdout); int t,cas=0; scanf("%d",&t); while(t--){ int n,u,v; scanf("%d",&n); //已经走了多少步,当前边的状态 int cnt=0,state=0; //两个人分别有几个三角形 int ca=0,cb=0; while(n--){ scanf("%d%d",&u,&v); int ta=ca,tb=cb; state=Get_Status(state,1<<mat[u][v],(cnt&1)?cb:ca); //没有新的三角形, if(ta==ca&&tb==cb) cnt++; } int ans; if(cnt&1) ans=MinSearch(state,-1,ca,cb); else ans=MaxSearch(state,1,ca,cb); printf("Game %d: %c wins.\n",++cas,ans==1?'A':'B'); } return 0; } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator