您的位置:首页 > 其它

一个小游戏

2015-09-02 15:44 411 查看
这个程序来源于csdn上看到竞赛问题.当然只是考虑最简单实现,没有考虑效率,当长度增加时, 运行时间将迅速增加. 

/*

  题目详情

  甲乙两个人用一个英语单词玩游戏。两个人轮流进行,每个人每次从中删掉任意一个字母,如果剩余的字母序列是严格单调递增的(按字典序a < b < c <....<z),则这个人胜利。两个人都足够聪明,甲先开始,问他能赢么?

  输入: 一连串英文小写字母,长度不超过15,保证最开始的状态不是一个严格单增的序列。

  输出:1表示甲可以赢,0表示甲不能赢。

  例如: 输入 bad, 则甲可以删掉b或者a,剩余的是ad或者bd,他就赢了,输出1。

  又如: 输入 aaa, 则甲只能删掉1个a,乙删掉一个a,剩余1个a,乙获胜,输出0。

*/

#include <string.h>

#include <stdio.h>

#include <stdlib.h>

int who (const char * word);

int sorted(const char * word);

int step;

int main()

{

  //使用标准输入做为

  //在可以获胜的情况下, 输出下一步取的位置

  char *word=malloc(1000);

  if(gets(word))

  {

    step=0;

    who(word);

  }

  free(word);

}

int who(const char * word)

{

  int result;

  // 如果已经是排序,则当前操作者输

  if(sorted(word))

  {

    result=0;

    goto done;

  }

  // 如果未排序且仅余2个字母,则当前操作者胜,不考虑输入仅1个字符的情况

  if(strlen(word)==2)

  {

    result=1;

    goto done;

  }

  // 其他情况下,选择一个字母删除,然后重新调用who

  // 如果其中有1种情况可以获胜,则当前操作者胜

  int i;

  for (i=0;i<strlen(word);i++)

  {

    char *split_word=(char *)malloc(strlen(word));

    step++;

    if(i)

    {

      strncpy(split_word,word,i);

    }

    strcpy(split_word+i,word+i+1);

    if (result=!who(split_word))

    {

      //如果当前为栈顶,则输出i

      if(!step)

        printf("you will win, remove position %d char, then remain %s\n",i,split_word);

      break;

    }

    free(split_word);

  }

done:

  step--;

  return result;

}

int sorted(const char * word)

{

  //判断是否已经按照要求排好序

  int i;

  for(i=0;i<strlen(word)-1;i++)

  {

    char m,n;

    m=*(word+i);

    n=*(word+i+1);

    if(m>=n)

    {

      return 0;

    }

  }

  return 1;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: