【博弈论】HDU 5754 Life Winner Bo

来源:互联网 发布:上海市人口普查数据 编辑:程序博客网 时间:2024/06/04 20:42
题目链接:

  http://acm.hdu.edu.cn/showproblem.php?pid=5754

题目大意

  4种棋子,象棋中的 1王,2车,3马,4后,选其一,B和G轮流走,不能往左上走,一开始棋子在(1,1),谁先走到(n,m)谁赢,无法走动算平局D。

  (n,m<=1000,case<=1000)

题目思路:

  【博弈论】

  这题博弈论。怎样都输为必败,只能走到必败的为必胜。

  王:(王可以横竖斜走一格)如果n个m均为奇数先手必败,否则必胜。

    从3x3格子看,当n和m均为奇数时先手必败,而且人总有办法一步从非均为奇走到均为奇。

  车:(横竖走,格数不受限制)n=m先手必胜,否则后手必胜。

    Nim问题。把横纵坐标看作两堆石子,每次可以从一堆取任意个。

  马:(两横一竖,两竖一横)(n+m)%3!=2无解,m=n时先手胜,m=n+1或者n=m+1时后手胜,否则平局。

    因为如果m=n,那么先手-2-1,后手就可以-1-2,重新回到m=n,而相差为1的时候先手把大的-2小的-1就到m=n的情况。

  后:(横竖斜都可以走,格数不受限制)威佐夫博弈。有公式我不会推。只能找规律了。

    把横纵坐标看作两堆石子,可以从任意一堆取任意个,或者从两堆同时取任意个,问谁先取完。

    先n--,m--,先手必败局面(奇异局势)。前几个奇异局势:(0,0)、(1,2)、(3,5)、(4,7)、(6,10)、(8,13)、(9,15)、(11,18)、(12,20)。

    看出a0=b0=0,ak是未在前面出现过的最小自然数,而bk=ak+k。

////by coolxxx//#include<iostream>#include<algorithm>#include<string>#include<iomanip>#include<memory.h>#include<time.h>#include<stdio.h>#include<stdlib.h>#include<string.h>//#include<stdbool.h>#include<math.h>#define min(a,b) ((a)<(b)?(a):(b))#define max(a,b) ((a)>(b)?(a):(b))#define abs(a) ((a)>0?(a):(-(a)))#define lowbit(a) (a&(-a))#define sqr(a) ((a)*(a))#define swap(a,b) ((a)^=(b),(b)^=(a),(a)^=(b))#define eps (1e-8)#define J 10000000#define MAX 0x7f7f7f7f#define PI 3.1415926535897#define N 1004using namespace std;typedef long long LL;int cas,cass;int n,m,lll,ans;int f[N<<1];void work1(){if(n&1 && m&1)puts("G");else puts("B");}void work2(){if(n==m)puts("G");else puts("B");}void work3(){if((n+m)%3!=2)puts("D");else if(m==n)puts("G");else if(abs(n-m)==1)puts("B");else puts("D");}void work4(){if(f[n]==m)puts("G");else puts("B");}int main(){#ifndef ONLINE_JUDGE//freopen("1.txt","r",stdin);//freopen("2.txt","w",stdout);#endifint i,j,x;for(i=1,j=0;i<=1000;i++){if(f[i])continue;f[i]=i+j;f[i+j]=i;j++;}for(scanf("%d",&cas);cas;cas--)//for(scanf("%d",&cas),cass=1;cass<=cas;cass++)//while(~scanf("%s",s))//while(~scanf("%d",&n)){scanf("%d%d%d",&cass,&n,&m); if(cass==1)work1();else if(cass==2)work2();else if(cass==3)work3();else if(cass==4)work4();}return 0;}/*////*/



0 0
原创粉丝点击