/*
问题描述:
围绕着山顶有10个圆形排列的洞,狐狸要吃兔子,兔子说:"可以,但必须找到我,
我就藏身于这十个洞中,你先到1号洞找,第二次隔1个洞(即3号洞)找,
第三次隔2个洞(即6号洞)找,以后如此类推,次数不限。"但狐狸从早到晚进进出出了1000次,
仍没有找到兔子。问兔子究竟藏在哪个洞里?
*/
#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define OVERFLOW -2
typedef int status;
typedef int ElemType;
typedef struct
{
ElemType *elem;
int length;
int listsize;
}SqList;
//构造一个线性表
status InitList_Sq(SqList *L,int n)
{
L->elem = (ElemType*)malloc(n*sizeof(ElemType));
if(!(L->elem))
return OVERFLOW;
L->length = 0;
L->listsize = n;
return OK;
}
//狐狸逮兔子函数
status findRabbit(SqList *L,int num)
{
int i, current = 0,find = 1;
for(i = 0; i < L->listsize; i++)
{
L->elem[i] = 1; //标记未进过的洞为1
}
for(i = 0; i < num; i++)
{
L->elem[current] = 0; //标记进过的洞为0
current = (current + i + 2) % L->listsize; //实现顺序表的循环引用
}
printf("\n兔子可能藏在如下洞中:");
for(i = 0; i < L->listsize; i++)
{
if((*L).elem[i] == 1)
{
printf("\n此洞是%d号洞", i+1);
find = 0;
}
}
if(find)
{
printf("兔子无处藏身!");
}
return OK;
}
void main()
{
int n,num;
SqList L;
printf("请输入洞的个数n = ");
scanf("%d",&n);
InitList_Sq(&L,n);
printf("请输入狐狸进出次数num = ");
scanf("%d",&num);
findRabbit(&L,num);
}