一个小游戏
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;
}
/*
题目详情
甲乙两个人用一个英语单词玩游戏。两个人轮流进行,每个人每次从中删掉任意一个字母,如果剩余的字母序列是严格单调递增的(按字典序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;
}
相关文章推荐
- thinkPHP的M()和D()的区别
- Android中SQLite用法
- DLL中传递STL参数
- OkHttp实现文件上传进度
- 一页纸说清楚“什么是大数据”
- json过滤list中的键值
- 经济--银行理财基础篇
- The content of element type "session-factory" must match "(property*,mapping*,(class-cache|collectio
- 备份脚本一
- Spring获取bean的步骤
- 排序算法:归并排序
- Android中自定义属性的使用
- Spring MVC 中 HandlerInterceptorAdapter的使用
- Spring获取bean的步骤
- warden 的设计与实现 总结
- Struts2 part 2:Action的编写方式
- 路由协议对比(更新中)
- SQL中distinct的用法(四种示例分析)
- 认识泛型的本质---反射学习笔记(三)
- 认识泛型的本质---反射学习笔记(三)