一个小游戏

这个程序来源于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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值