• hdu1356&hdu1944 博弈论的SG值(王道)


                                                                                S-Nim
    Problem Description
    Arthur and his sister Caroll have been playing a game called Nim for some time now. Nim is played as follows:


    The starting position has a number of heaps, all containing some, not necessarily equal, number of beads.

    The players take turns chosing a heap and removing a positive number of beads from it.

    The first player not able to make a move, loses.


    Arthur and Caroll really enjoyed playing this simple game until they recently learned an easy way to always be able to find the best move:


    Xor the number of beads in the heaps in the current position (i.e. if we have 2, 4 and 7 the xor-sum will be 1 as 2 xor 4 xor 7 = 1).

    If the xor-sum is 0, too bad, you will lose.

    Otherwise, move such that the xor-sum becomes 0. This is always possible.


    It is quite easy to convince oneself that this works. Consider these facts:

    The player that takes the last bead wins.

    After the winning player's last move the xor-sum will be 0.

    The xor-sum will change after every move.


    Which means that if you make sure that the xor-sum always is 0 when you have made your move, your opponent will never be able to win, and, thus, you will win.

    Understandibly it is no fun to play a game when both players know how to play perfectly (ignorance is bliss). Fourtunately, Arthur and Caroll soon came up with a similar game, S-Nim, that seemed to solve this problem. Each player is now only allowed to remove a number of beads in some predefined set S, e.g. if we have S =(2, 5) each player is only allowed to remove 2 or 5 beads. Now it is not always possible to make the xor-sum 0 and, thus, the strategy above is useless. Or is it?

    your job is to write a program that determines if a position of S-Nim is a losing or a winning position. A position is a winning position if there is at least one move to a losing position. A position is a losing position if there are no moves to a losing position. This means, as expected, that a position with no legal moves is a losing position.
     

    Input
    Input consists of a number of test cases.
    For each test case: The rst line contains a number k (0 < k <= 100) describing the size of S, followed by k numbers si (0 < si <= 10000) describing S. The second line contains a number m (0 < m <= 100) describing the number of positions to evaluate. The next m lines each contain a number l (0 < l <= 100) describing the number of heaps and l numbers hi (0 <= hi <= 10000) describing the number of beads in the heaps.
    The last test case is followed by a 0 on a line of its own.
     

    Output
    For each position:
    If the described position is a winning position print a 'W'.
    If the described position is a losing position print an 'L'.
    Print a newline after each test case.
     

    Sample Input
    2 2 5
    3
    2 5 12
    3 2 4 7
    4 2 3 7 12
    5 1 2 3 4 5
    3
    2 5 12
    3 2 4 7
    4 2 3 7 12
    0
     

    Sample Output
    LWW
    WWL

    用dfs搜索sg值

     1 #include <iostream>
     2 #include <string.h>
     3 #include <algorithm>
     4 using namespace std;
     5 int a[101];
     6 int t;
     7 int b[10001];
     8 int dfs(int x)
     9 {
    10     if(b[x]!=-1)return b[x];
    11     int i;
    12     if(x-a[0]<0)return 0;
    13     int c[101];
    14     memset(c,0,sizeof(c));
    15     for(i=0;i<t;i++)
    16     {
    17         if(x-a[i]<0)
    18         {
    19             break;
    20         }
    21         c[dfs(x-a[i])]=1;
    22     }
    23     for(i=0;i<101;i++)
    24     if(c[i]==0)
    25     {
    26         b[x]=i;
    27         break;
    28     }
    29     return b[x];
    30 }
    31 int main()
    32 {
    33     while(cin>>t&&t){
    34     memset(a,0,sizeof(a));
    35     memset(b,-1,sizeof(b));
    36     int j;
    37     for(j=0;j<t;j++)
    38     cin>>a[j];
    39     sort(a,a+t);
    40     int i;
    41     b[0]=0;
    42     int n;
    43     cin>>n;
    44     for(i=0;i<n;i++)
    45     {
    46         int m;
    47         int sum=0,x;
    48         cin>>m;
    49         for(j=0;j<m;j++)
    50         {
    51             cin>>x;
    52             sum^=dfs(x);
    53         }
    54         if(sum)
    55         cout<<"W";
    56         else cout<<"L";
    57     }
    58     cout<<endl;
    59     }
    60 }
    View Code
  • 相关阅读:
    Objective C 代码片段(类别)
    误释放对象
    浏览器内核信息整理
    Oracle VM Virtual 下CentOS不能自动获取IP地址
    git 命令归纳
    马蜂窝 iOS App 启动治理:回归用户体验
    马蜂窝火车票系统服务化改造初探
    让前端监控数据采集更高效
    状态机在马蜂窝机票订单交易系统中的应用与优化实践
    马蜂窝张矗:我对技术团队绩效考核管理的几点思考
  • 原文地址:https://www.cnblogs.com/ERKE/p/3262045.html
Copyright © 2020-2023  润新知