zoukankan      html  css  js  c++  java
  • HDU 5754 Life Winner Bo (找规律and博弈)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5754

    给你四种棋子,棋子一开始在(1,1)点,两个人B和G轮流按每种棋子的规则挪动棋子,棋子只能往右下方移动,谁最后先挪动棋子到(n,m)位置,谁就胜利。要是两个人都不可能赢,就输出D。

    king的情况在纸上模拟了一下,感觉就是当n*m为奇数时先手输,否则就赢。

    rook的情况比较简单,相当于在两堆石子中取石子,只能在一堆中取。当n等于m时,先手必败,因为先手怎么取,后手都会跟上取 使得两堆石子相同。

    knight的情况也是在纸上模拟了一下,发现4*4  7*7  10*10...这些情况先手都是输,因为先手无论怎走,后手都会调整方向,所以(n == m && (n - 1) % 3 == 0)时,先手输。

    还有2*3  5*6  8*9...都是先手赢。其余都是平局。

    queen的情况,比赛的时候没发现,原来是威佐夫博弈,问题可以转化为两堆石子,可以从中一堆取,或者从两堆中取同样的数目。具体可以百度一下,套个公式就可以了,注意n和m要减1。

     1 //#pragma comment(linker, "/STACK:102400000, 102400000")
     2 #include <algorithm>
     3 #include <iostream>
     4 #include <cstdlib>
     5 #include <cstring>
     6 #include <cstdio>
     7 #include <vector>
     8 #include <cmath>
     9 #include <ctime>
    10 #include <list>
    11 #include <set>
    12 #include <map>
    13 using namespace std;
    14 typedef long long LL;
    15 typedef pair <int, int> P;
    16 const int N = 1e5 + 5;
    17 
    18 void king(int n, int m) {
    19     if((n * m) % 2)
    20         printf("G
    ");
    21     else
    22         printf("B
    ");
    23 }
    24 
    25 void rook(int n, int m) {
    26     if(n == m)
    27         printf("G
    ");
    28     else
    29         printf("B
    ");
    30 }
    31 
    32 void knight(int n, int m) {
    33     if(n < m)
    34         swap(n , m);
    35     if(n == m && (n - 1) % 3 == 0)
    36         printf("G
    ");
    37     else if(n - m == 1 && n % 3 == 0)
    38         printf("B
    ");
    39     else
    40         printf("D
    ");
    41 }
    42 
    43 void queen(int n, int m) {
    44     n-- , m--;
    45     double x = (1 + sqrt(5.0))/2.0;
    46     if(n < m)
    47         swap(n , m);
    48     if(m == int((n - m)*x))
    49         printf("G
    ");
    50     else
    51         printf("B
    ");
    52 }
    53 
    54 int main()
    55 {
    56     int t , n , m , c;
    57     scanf("%d" , &t);
    58     while(t--) {
    59         scanf("%d %d %d" , &c , &n , &m);
    60         if(c == 1) {
    61             king(n , m);
    62         }
    63         else if(c == 2) {
    64             rook(n , m);
    65         }
    66         else if(c == 3) {
    67             knight(n , m);
    68         }
    69         else {
    70             queen(n , m);
    71         }
    72     }
    73     return 0;
    74 }
  • 相关阅读:
    makefile vpath变量
    博客园 文章和随笔区别
    Linux OpenGL 实践篇-6 光照
    HTC Vive 叠影器无法创建设备
    Mybatis注解
    MyBatis缓存
    MyBatis关联映射
    动态sql
    MyBatis智能标签
    Mybatis模糊查询及自动映射
  • 原文地址:https://www.cnblogs.com/Recoder/p/5711145.html
Copyright © 2011-2022 走看看