• 【博弈论】取火柴游戏


    取火柴游戏

    时间限制: 1 Sec  内存限制: 128 MB

    题目描述

    输入k及k个整数n1,n2,…,nk,表示有k堆火柴棒,第i堆火柴棒的根数为ni;接着便是你和计算机取火柴棒的对弈游戏。取的规则如下:每次可以从一堆中取走若干根火柴,也可以一堆全部取走,但不允许跨堆取,也不允许不取。

        谁取走最后一根火柴为胜利者。

        例如:k=2,n1=n2=2,A代表你,P代表计算机,若决定A先取:

        A:(2,2)→(1,2)    {从一堆中取一根}

        P:(1,2)→(1,1)    {从另一堆中取一根}

        A:(1,1)→(1,0)

        P:(1,0)→ (0,0)    {P胜利}

        如果决定A后取:

        P:(2,2)→(2,0)

        A:(2,0)→ 0,0)    {A胜利}

        又如k=3,n1=1,n2=2,n3=3,A决定后取:

        P:(1,2,3)→(0,2,3)

        A:(0,2,3)→(0,2,2)

        A已将游戏归结为(2,2)的情况,不管P如何取A都必胜。

        编一个程序,在给出初始状态之后,判断是先取必胜还是先取必败,如果是先取必胜,请输

    出第一次该如何取。如果是先取必败,则输出“lose”。

    输入

     输入k及k个整数n1,n2,…,nk,表示有k堆火柴棒,第i堆火柴棒的根数为ni;

    输出

    判断是先取必胜还是先取必败,如果是先取必胜,请输出第一次该如何取。如果是先取必败,则输出“lose”。

    样例输入

    3
    3 6 9
    

    样例输出

    4 3
    3 6 5 

    输出确实很坑人。。。

     1 #include <iostream>
     2 
     3 using namespace std;
     4 
     5 int n;
     6 int a[1111];
     7 int s,k,maxx;
     8 
     9 int main()
    10 {
    11     cin>>n;
    12     s=k=maxx=0;
    13     for(int i=0;i<n;i++)
    14     {
    15         cin>>a[i];
    16         s=s^a[i];
    17         if(i<n-1)
    18             k=k^a[i];
    19         if(a[maxx]<a[i])
    20             maxx=i;
    21     }
    22     if(s==0)
    23         cout<<"lose"<<endl;
    24     else
    25     {
    26         cout<<a[maxx]-k<<" "<<maxx+1<<endl;
    27         a[maxx]=k;
    28         for(int i=0;i<n-1;i++)
    29             cout<<a[i]<<" ";
    30         cout<<a[n-1];
    31     }
    32     return 0;
    33 }
  • 相关阅读:
    layui的table使用,二
    将字符串中的以某个字符间隔放到数组中
    oracle中的 函数应用
    spring 的3种常用的注入方式
    写一个方法,输入两个正整数,输出在两个正整数范围内即被3整除,又被7整除的正整数
    Myeclipse 10.7配置egit及导入项目
    Plsqi安装
    web项目引入js包时,报syntax error on token
    java笔试面试题总结
    web.xml中的配置
  • 原文地址:https://www.cnblogs.com/asuml/p/5700269.html
Copyright © 2020-2023  润新知