2016 Multi-University Training Contest 3

官方题解

1003

题意:国际象棋 王 后 马 单 四种类型的走法。B先手G后手,轮流走。n*m的棋盘。谁先走到(n,m)谁赢,输出赢的人,平局D

比赛wrong12发。。。。。

和题解说的差不多

后 的时候就是威佐夫博弈

 1 // #pragma comment(linker, "/STACK:102c000000,102c000000")
 2 #include <iostream>
 3 #include <cstdio>
 4 #include <cstring>
 5 #include <sstream>
 6 #include <string>
 7 #include <algorithm>
 8 #include <list>
 9 #include <map>
10 #include <vector>
11 #include <queue>
12 #include <stack>
13 #include <cmath>
14 #include <cstdlib>
15 // #include <conio.h>
16 using namespace std;
17 #define clc(a,b) memset(a,b,sizeof(a))
18 #define inf 0x3f3f3f3f
19 #define lson l,mid,rt<<1
20 #define rson mid+1,r,rt<<1|1
21 const int N = 100010;
22 const int M = 1e6+10;
23 const int MOD = 1e9+7;
24 #define LL long long
25 #define LB long double
26 #define mi() (l+r)>>1
27 double const pi = acos(-1);
28 const double eps = 1e-8;
29 void fre() {
30     freopen("in.txt","r",stdin);
31 }
32 // inline int r() {
33 //     int x=0,f=1;char ch=getchar();
34 //     while(ch>'9'||ch<'0') {if(ch=='-') f=-1;ch=getchar();}
35 //     while(ch>='0'&&ch<='9') { x=x*10+ch-'0';ch=getchar();}return x*f;
36 // }
37 
38 int main(){
39     int T;
40     scanf("%d",&T);
41     int t,n,m;
42     while(T--){
43         scanf("%d%d%d",&t,&n,&m);
44         if(n>m) swap(n,m);
45         if(t==1){
46             if(n%2==1&&m%2==1){
47                 printf("G
");
48                 continue;
49             }
50             else{
51                 printf("B
");
52                 continue;
53             }
54         }
55         else if(t==2){
56             if(n==m){
57                 printf("G
");
58                 continue;
59             }
60             else{
61                 printf("B
");
62                 continue;
63             }
64         }
65         else if(t==3){
66            if(n==m&&n%3==1) printf("G
");
67             else if(m-n==1&&n%3==2&&m%3==0) printf("B
");
68             else printf("D
");
69         }
70         else{
71             m = m  - 1;
72             n = n - 1;
73             int c=min(m,n);
74             double k = (1.0+sqrt(5))/2.0;
75             int tem=(int)(abs(n-m)*(k));
76             if(c==tem){
77                 printf("G
");
78             }
79             else{
80                 printf("B
");
81             }
82             continue;
83         }
84     }
85     return 0;
86 }
View Code
原文地址:https://www.cnblogs.com/ITUPC/p/5709363.html