丢沙包游戏(或杀人游戏)的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)个点,求这个方案成功的概率 题解: 一道非常好的题目! 题目要知道最大的 ...
随机推荐
- SQL Server查询数据库中所有的表名及行数
SELECT a.name, b.rows FROM sysobjects AS a INNER JOIN sysindexes AS b ON a.id = b.id WHERE (a.type = ...
- [Javascript] Ex: concatAll, map and filter
concatAll: Array.prototype.concatAll = function() { var results = []; this.forEach(function(subArray ...
- Bluetooth 4.0之Android 讲解
Android平台包含了对蓝牙网络协议栈的支持,它允许一个蓝牙设备跟其他的蓝牙设备进行无线的数据交换.应用程序通过Android蓝牙API提供访问蓝牙的功能.这些API会把应用程序无线连接到其他的蓝牙 ...
- secureCRT常用设置
一.快捷键: 1. ctrl + a : 移动光标到行首[常用] 2. ctrl + e :移动光标到行尾[常用] 3. ctrl + d :删除光标之后的一个字符 4. ctrl + w : 删除行 ...
- Android开发JDBC连接mysql数据库导入驱动方法
在使用JDBC编程时需要连接数据库,导入JAR包是必须的,导入其它的jar包方法同样如此,导入的方法是 打开eclipse 1.右击要导入jar包的项目,点properties 2.左边选择java ...
- Java代码安全测试解决方案
Java代码安全测试解决方案: http://gdtesting.com/product.php?id=106
- Orcle11g用户密码恢复
1.当安装Orcle11g后,很久不用,忘记了用户名和密码.可以通过以下方法重置: 如上图及重置用户sys,system密码为123
- 你不知道的javascript 上卷 读书笔记
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- C# DataTable转List And List转DataTable
// DataTable转List: IList<HousesEntity> Ilist = TableAndList.ConvertTo<HousesEntity>(dt); ...
- poj1182 食物链(种类并查集)详解
poj 1182 http://poj.org/problem?id=1182 分析:这个题大意说的非常清楚了,就是求出假话的个数,题目中给的假话要求有三个 ① 当前的话与前面的某些真的话冲突,是 ...