使用数组法解决约瑟夫环问题
约瑟夫入狱,监狱内共有33个犯人。某日33名犯人围成一圈,从第一个犯人开始报数,报到数字7的犯人出列,被枪毙,下一名犯人重新从1开始报数。依次类推,直至剩下最后1名犯人可被赦免。聪明的约瑟夫在心里稍加计算,算出了最后枪毙的位置,他站在这个位置,最终避免了自己被枪毙,逃出升天。
问:约瑟夫算出的是哪个位置?
提示:对于约瑟夫环问题来说,需要解决3个问题
- 如何解决数组循环的问题?
- 如何解决“逢7一杀”这个逻辑?
- 如何处理“已死之人”?
代码的实现:
#include <stdio.h>
#define N 33
#define KILL 7
int main(){
/*定义犯人数组,全部元素置零表示没被噶*/
int prisoner[N] = {0};
/*记录被噶了几个犯人*/
int counter = 0;
/*数组索引*/
int index = 0;
/*报数*/
int num = 0;
/*有一个辛存者,所以被噶了32个犯人时结束循环*/
while(counter != N-1){
/*如果数组索引=33,则置零再继续*/
if(index == N){
index = 0;
}
/*值为0 ,说明还没噶,要继续报数*/
if(prisoner[index] == 0){
num++;
/*报到7的人,噶了*/
if(num == KILL){
prisoner[index] = 1;
/*被嘎人数+1*/
counter++;
/*有人被噶,重新从1开始报数*/
num = 0;
printf("第%2d轮报数,%2d号位置的人被嘎了\n",counter,index+1);
}
}
index++;
}
/*循环结束,遍历数组,看看约瑟夫站哪了*/
for(int i = 0;i < N;i++){
if(prisoner[i] == 0){
printf("约瑟夫在第%d个位置\n",i+1);
}
}
return 0;
}
运行结果: