我正在尝试编写一个代码来模拟一个circle
拥有一把剑的固定大小的人。最接近当前的“活人”index
将被淘汰,剑将传给下一个活人(在被杀死的人之后),依此类推。
我希望它在没有链表的情况下编写。
示例:
一组 3 人:
arr[0] = 1, arr[1] = 1, arr[2] = 1
第一回合:
arr[0] KILLS arr[1] and the sword gets PASSED to arr[2]
第一回合后的元素值:
arr[0] = 1, arr[1] = 0, arr[2] = 1
第二回合:
arr[2] KILLS arr[0] and stays the last player
第二回合后的元素值:
arr[0] = 0, arr[1] = 0, arr[2] = 1
arr[2]'s index gets returned by the main function
.
我想到的是:
- 大批
- 将所有元素的值设置为
1
- 每次循环检查
if (1 == arr[i])
- 设置一个标志来确定是杀死还是只是将剑传给这个家伙。
- 返回当前索引,指示这是最后一个活着的玩家的索引。
例如,假设我们组中有 5 个人:
[1] [1] [1] [1] [1]
第一轮:
give_sword = 0
i = 0
不进入第一个if
是因为give_sword
不是1
。它进入 second if
,并使用该函数找到最近的活人findClosestLivingPerson
并获取他的索引并将他的值设置为0
(==杀死最近的活人)。它设置give_sword
为1
。
减少players_counter
并检查是否只剩下一名玩家。如果不是,则继续循环。
这是我的代码:
#include <stdio.h>
int findClosestLivingPerson(int arr[], int index, int group_size);
int main (int argc, char *argv[])
{
int group_size = 0, players_counter = 0;
int i = 0, give_sword = 0;
int arr[100] = {0};
printf("Enter group size: \n");
scanf("%d",&group_size);
for (i = 0; i < group_size; i++)
{
arr[i] = 1;
}
players_counter = group_size;
for (i = 0; i < group_size; (i+1) % group_size)
{
if (1 == arr[i])
{
if(1 == give_sword) /* should give sword, not to kill */
{
give_sword = 0;
}
else /* should be killed */
{
arr[findClosestLivingPerson(arr,i, group_size)] = 0;
give_sword = 1;
--players_counter;
if (players_counter == 1)
{
break;
}
}
}
}
printf("Winner is %d ",i);
return 0;
}
int findClosestLivingPerson(int arr[], int index, int group_size)
{
for (; index < group_size; (index+1) % group_size)
{
if (arr[index] == 1)
return index;
}
return 0;
}
编译器说:
在函数'main'中:last_man.c:23:43:警告:没有效果的语句[-Wunused-value] 23 | 对于 (i = 0; i < group_size; (i+1) % group_size)
last_man.c:在函数“findClosestLivingPerson”中:last_man.c:49:42:警告:声明无效 [-Wunused-value] 49 | for (; index < group_size; (index+1) % group_size)
(index+1) % group_size
是为了在这个数组中循环。