丢沙包游戏(或杀人游戏)的C语言实现
丢沙包游戏(或杀人游戏)用C语言实现:
游戏简述:
杀人游戏(或者丢沙包游戏),设定一些人(人数为:num)一起玩游戏,从某个指定的人(设定为:start)开始轮流扔沙包,扔沙包人的下一个人为1,每隔固定人数(设定为:step)砸中一个人,则该人被杀退出游戏,到最后一人后重新接第一个人开始计数,依次轮流进行,直到最后只剩下一个人,游戏结束!
游戏代码:
/***********************************************************************************
简述:
杀人游戏(或者丢沙包游戏),一些人(num)一起玩游戏,从某个指定的人(start)开始
轮流扔沙包,每隔固定人数(step)砸中一个人,该人被杀退出游戏,依次进行,直到最后
只剩下一个人,游戏结束!
Date:
2015.12.05
***********************************************************************************/ #include <stdio.h>
#include <stdlib.h> void show_people(int *people, int num) //打印当前的杀人状况
{
int i;
printf("People alive: ");
for (i = ; i < num; i++)
{
if (i % == )
putchar('\n');
printf("%d\t", *(people + i));
}
printf("\n");
} int check_rest(int *people, int num) //检查剩余人数
{
int i, count = ;
for (i = ; i < num; i++)
{
if (*(people + i) != )
count++;
}
return count;
} void init_people(int *people, int num) //初始化任务位置编号
{
int i;
for (i = ; i < * num; i++)
{
*(people + i) = (i < num) ? (i + ) : (i + - num);
}
} int jump_killed(int *people, int p)
{
while (*( people + p - ) == ) //遇到人被杀掉的位置后跳过
{
p++;
}
return p;
} int check_num(int num, int step, int start) //检查游戏参数的有效性
{
if ( ( num <= ) || ( step <= ) || ( start <= ) )
{
printf("Sorry! Maybe number error!\n");
printf("Press any key to exit!");
return ;
}
if ( ( *num <= step ) || ( start > num ) )
{
printf("Sorry! People number is small than step! Game over!\n");
printf("Press any key to exit!");
return ;
} return ;
} int main (void)
{
int i, num = , step = , start = ;
int *people = NULL;
int rest = , round = ;
int p = ; printf("\nHi! This is a game, that throw bag to kill people!\n");
printf("Now, let's begin the game!\n");
printf("First, enter the number of people in the game(>0): ");
scanf("%d", &num);
printf("Second, enter the step to pull people out(>0&&<num): ");
scanf("%d", &step);
printf("Third, enter one people to start the game(>0&&<num): ");
scanf("%d", &start); if (check_num(num, step, start))
{
getchar();
getchar();
return ;
} people =(int *) malloc( * num * sizeof(int) );//创建两倍人数的内存空间
if (people == NULL) //创建内存失败,退出游戏
return ; printf("\nOk! We have %d people in this game, and we will kill people "\
"from N0:%d people every %d people like this: \n",num, start, step); init_people(people, num); //将游戏中人编号初始化为位置序号
p = start;
rest = check_rest(people, num); while ( rest > )
{
int i = , j = , stemp = ; while ( i < step )
{
if (*( people + p - ) != ) //余下的人中逐个计数
i++;
p++;
p = (p > * num) ? (p - * num) : p; //位置指针超出缓存,调整
p = (p > num) ? (p - num) : p;
p = jump_killed(people, p); //遇到人被杀掉的位置后跳过
} stemp = p - ; //将人的编号和内存位置匹配
round++;
*(people + stemp) = ; //People was killed!
stemp = p > num ? ( stemp - num ) : ( stemp + num );
*(people + stemp) = ;
p = p > num ? ( p - num ) : p;
printf("Round %d: No.%d was killed! \t%d people leave!\n",round, p, rest-);
rest = check_rest(people, num); //清点剩余人数
} for ( i = ; i < num; i++) //游戏结束,找到剩余的最后一个人
{
if (*( people + i ) != )
break;
}
printf("Game over! No.%d people alive!\n", i+); free(people);
getchar();
getchar();
return ;
}
代码简述:
定义两倍于人数的内存空间作为缓存,每个人按照自己所处的位置进行编号,被杀掉的位置,编号置为零,表示该人已被杀,所有编号不等于零的位置,代表没有被淘汰的人,每一轮清点剩下未被淘汰的人数,游戏依次进行,指导剩下一个人为止。
丢沙包游戏(或杀人游戏)的C语言实现的更多相关文章
- hdu2211杀人游戏
Problem Description 不知道你是否玩过杀人游戏,这里的杀人游戏可没有法官,警察之类的人,只有土匪,现在已知有N个土匪站在一排,每个土匪都有一个编号,从1到N,每次杀人时给定一个K值, ...
- 【BZOJ-2438】杀人游戏 Tarjan + 缩点 + 概率
2438: [中山市选2011]杀人游戏 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1638 Solved: 433[Submit][Statu ...
- 杀人游戏(hdu2211)插入法
杀人游戏 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...
- 【acm】杀人游戏(hdu2211)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2211 杀人游戏 Time Limit: 3000/1000 MS (Java/Others) M ...
- 【BZOJ2438】[中山市选]杀人游戏 Tarjan+概率
[中山市选]杀人游戏 Tarjan+概率 题目描述 一位冷血的杀手潜入\(Na\)-\(wiat\),并假装成平民.警察希望能在\(N\)个人里面,查出谁是杀手.警察能够对每一个人进行查证,假如查 ...
- BZOJ 2438:杀人游戏(tarjan+概率)
杀人游戏Description一位冷血的杀手潜入 Na-wiat,并假装成平民.警察希望能在 N 个人里面,查出谁是杀手. 警察能够对每一个人进行查证,假如查证的对象是平民,他会告诉警察,他认识的人, ...
- bzoj2438 杀人游戏 Tarjan强联通
[bzoj2438][中山市选2011]杀人游戏 Description 一位冷血的杀手潜入 Na-wiat,并假装成平民.警察希望能在 N 个人里面,查出谁是杀手.警察能够对每一个人进行查证,假如查 ...
- BZOJ_2438_[中山市选2011]杀人游戏 _强连通分量
BZOJ_2438_[中山市选2011]杀人游戏 _强连通分量 Description 一位冷血的杀手潜入 Na-wiat,并假装成平民.警察希望能在 N 个人里面,查出谁是杀手.警察能够对每一个人 ...
- bzoj2438: [中山市选2011]杀人游戏(强联通+特判)
2438: [中山市选2011]杀人游戏 题目:传送门 简要题意: 给出n个点,m条有向边,进行最少的访问并且可以便利(n-1)个点,求这个方案成功的概率 题解: 一道非常好的题目! 题目要知道最大的 ...
随机推荐
- RadHat搭建内网YUM源server
前言:随着内网linuxserver越来越多,在每台server上安装软件.都要先把安装盘上传上去.在配置本地yum服务,即麻烦又费时.能够在内网的一台linuxserver上安装yum服务,然后其它 ...
- Linq-表达式常用写法
这里主要是将数据库中的常用操作用LAMBDA表达式重新表示了下,用法不多,但相对较常用,等有时间了还会扩展,并将查询语句及LINQ到时也一并重新整理下:1.select语句:books.Select( ...
- UVA 10714 Ants 蚂蚁 贪心+模拟 水题
题意:蚂蚁在木棍上爬,速度1cm/s,给出木棍长度和每只蚂蚁的位置,问蚂蚁全部下木棍的最长时间和最短时间. 模拟一下,发现其实灰常水的贪心... 不能直接求最大和最小的= =.只要求出每只蚂蚁都走长路 ...
- careercup-树与图 4.8
4.8 你有两棵非常大的二叉树:T1,有几百万个结点:T2,有几百个结点.设计一个算法,判断T2是否为T1的子树. 如果T1有这么一个结点n,其子树与T2一模一样,则T2C++实现代码: #inclu ...
- HDU4570:Multi-bit Trie(区间DP)
Problem Description IP lookup is one of the key functions of routers for packets forwarding and clas ...
- MySQL【第一篇】安装
一.简介 MySQL 是最流行的关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle公司.MySQL所使用的SQL语言是用于访问数据库的最常用标准化语言.MySQL由于其体积小. ...
- string与StringBuilder之性能比较
知道“StringBuilder比string性能强”好多年了,近日无聊病发作,就把这两个家伙给动了手术: using System; using System.Text; namespace Con ...
- 解决在mybatis中使用CTE进行oracle查询数据类型为long的字段出现流关闭问题
今天把notice表中的content字段改为long字段后,含有该字段的使用CTE的查询语句报错了.提示一下错误 ### Cause: java.sql.SQLException: 流已被关闭 ; ...
- js 字符串编码转换函数
escape 方法 对 String 对象编码以便它们能在所有计算机上可读, escape(charString) 必选项 charstring 参数是要编码的任意 String 对象或文字. 说明 ...
- Oracle 数据库(oracle Database)Select 多表关联查询方式
Oracle数据库中Select语句语法及介绍 SELECT [ ALL | DISTINCT ] <字段表达式1[,<字段表达式2[,…] FROM <表名1>,<表名 ...