实验要求:(一)问题描述
围绕着山顶有10个圆形排列的洞,狐狸要吃兔子,兔子说:”可以,但必须找到我,我就藏于这10个洞中,你先到1号洞找,第二次隔1个洞(即3号洞)找,第二次隔2个洞(即6号洞)找,以后如此类推,次数不限.”但狐狸从早到晚进进出出了1000次,仍没有找到兔子.问:兔子究竟藏在那个洞里?
(二)问题分析
这实际上是一个反复查找线性表的过程.
定义一个顺序表,用具有10个元素的顺序表来表示这10个洞.每个元素表示围绕山顶的一个洞,下标为洞的编号.对所有洞设置初始标志为1,然后通过1000次循环,对每次所进之洞修改标志为0,最后输出标志为1的洞,即兔子藏身的洞.
(三)问题要求
1.设计一种存储方式用于存储山洞,元素的下标表示山洞的编号,元素的值为1表示狐狸没有进过山洞,为0表示狐狸进过该山洞.
2.为保持程序的通用性,山洞的数目和狐狸进出山洞的次数不一定为题设的10和1000,可由用户从键盘输入.
3.要求编写函数模拟狐狸逮兔子的过程,并输出兔子可能的藏身之处.
实验结果:
#include
#include
#include<malloc.h>
using namespace std;
typedef struct node
{
int num;
int temp;
struct nodenext;
}sqlist;
int main()
{
void f(int n, int m);
int n, m;
cout << “请输入山洞的数目:”;
cin >> n;
cout << “请输入狐狸进出洞的次数:”;
cin >> m;
f(n, m);
return 0;
}
void f(int n, int m)
{
sqlisthead, *p1, p2, p3;
int count = 0, j = 1, z;
head = p2 = (sqlist)malloc(sizeof(sqlist));
head->temp = 1;
head->num = j;
while (n > 1)
{
p1 = (sqlist)malloc(sizeof(sqlist));
p2->next = p1;
p2 = p1;
p2->temp = 1;
j++;
p2->num = j;
n–;
}
p3 = p1;
p1->next = head;
p1 = head;
while (m > 0)
{
if (count == 0)
{
p1->temp = 0;
count++;
}
else
{
p1->temp = 0;
}
count++;
z = count;
while (z > 0)
{
p1 = p1->next;
z–;
}
m–;
}
p3->next = NULL;
p1 = head;
cout << “兔子可能在的洞口:”;
while (p1->next != NULL)
{
if (p1->temp == 1)
cout << p1->num << “号洞口” <<" ";
p1 = p1->next;
}
}