智能小兵吧 关注:132贴子:2,508
  • 1回复贴,共1

又来简单好玩的捡石头棋题喽!!

只看楼主收藏回复

         一堆石头,每次可以拿掉1,2,3,4,两人轮流拿,最后总有一人没法拿了就算输。举例:初值3,每次可拿掉1,2,第一人可留下 2 或 1 都是输的下法,所以是先者输。现出4题:
题1: 初值20,每次可拿掉 1,2,4 问先者赢还是输?赢的话第一步怎样拿?
题2: 初值30,每次可拿掉 1,2,6 问先者赢还是输?赢的话第一步怎样拿?
题3: 初值100,每次可拿掉 1,2,6,10 问先者赢还是输?赢的话第一步怎样拿?
题4: 初值200,每次可拿掉 1,2,6,10,18 问先者赢还是输?赢的话第一步怎样拿?
题5: 初值500,每次可拿掉 1,2,6,10,18,34 问先者赢还是输?赢的话第一步怎样拿?  



1楼2011-02-27 10:01回复
    金陵飞雄奉献给大家的代码(答案是对的,只是只给出一个解,没考虑多解的情况),谢谢金陵飞雄!
    样例输入:(对应小兵的样例)
    3 2
    1 2
    样例输出:
    First Player loses
    */
    ifstream fin("Test.in");
    ofstream fout("Test.out");
    int n,pacn;            // n:石子总数    pacn:可拿石子的方案数
    int *access,*method;     // access:可拿石子的方案(数组)     method:存放必胜方案
    bool *win;             // win:记录当先手面对总数为X的石子堆的时候 是 否 有必胜策略
    void init(){
          fin >> n >> pacn;
          access=new int[pacn];
          for(int i=0;i<pacn;i++){
              fin >> access[i];
              if(access[i]>n){              // 如果可拿的比总数还大,break掉
                  pacn=i;
                  break;
              }
          }
    }
    void process(){
          win=new bool[n+1];
          method=new int[n+1];
          memset(win,0,sizeof(bool)*(n+1));
          for(int i=0;i<pacn;i++){
              win[access[i]]=true;           // 当前面对的正好是某方案数,那就掩面吧- -
              method[access[i]]=access[i];
          }
          for(int i=access[0];i<=n;i++){
              for(int j=0;j<pacn;j++){
                  if(i>access[j])
                      if(!win[i-access[j]]){        // 如果取后对方面对的是必负情况
      
                          win[i]=true;              // 当前情况必胜
                          method[i]=access[j];
                      }
              }
              /*fout << i << ' ' << win[i] << endl;
              if(win[i])
                  fout << method[i] << endl;*/               // Debug输出 格式:石子总数 是否先手必胜 方案
          }
          if(win[n]){
              fout << "First Player wins" << endl;
              fout << method[n] << endl;
          }
          else
              fout << "First Player loses" << endl;
          delete access;
          delete win;
          delete method;
    }
    int main(){
          init();
          process();
          return 0;
    }
    /*
    


    2楼2011-03-04 03:47
    回复