您的位置:首页 > 其它

算法 狼找兔子问题

2016-01-24 17:12 435 查看
<pre name="code" class="cpp">/*
狼找兔子问题
本程序采用循环链表思想解决问题,通过循环遍历,查找结点,并在查找结点做一个标记,并在统计count上自增1,
查找结束后,通过检查count值,如果count<n,说明有满足题意的躲藏点,并输出未作标记的节点;否则,兔子没有躲藏点。
*/



/*
狼找兔子问题
本程序采用循环链表思想解决问题,通过循环遍历,查找结点,并在查找结点做一个标记,并在统计count上自增1,
查找结束后,通过检查count值,如果count<n,说明有满足题意的躲藏点,并输出未作标记的节点;否则,兔子没有躲藏点。
*/

#include<stdio.h>
#include<stdlib.h>

//定义结点
struct point
{
int num ;   //当前结点所在位置,从0开始算起,依次类推
int sign ;  //标志位,检查是否被查找过,0代表未被查找,1代表已经被查到过
struct point *next ;
};

int main(void)
{
int n , m;   // n 代表洞 , m代表跨越查找步长
printf("please input number n and m : \n");

scanf("%d",&n);
scanf("%d",&m);

struct point *p = NULL;
struct point *s = NULL;

//循环遍历,依次创建 n 个结点
for(int i = 0 ; i < n ; i++)
{
if(i == 0) //创建第一个结点
{
p = (struct point * )malloc(sizeof(struct point)) ;
p->num = i;
p->sign = 0;
p->next  = p;
}

else     //在第一个结点基础上,继续创建余下结点
{
s = (struct point * )malloc(sizeof(struct point)) ;
s->num = i;
s->sign = 0;
s->next = p->next ;
p->next  = s;
p = s;
}
}

p = p->next ; //将 p指正回归到最开始那个结点

struct point *q = NULL;
q = p ;

int count = 0;

//开始遍历查找
while(q->sign == 0)
{
q->sign = 1;
count++;      //统计找到结点数
int j = 0;
while( j < m)  //向前推m步
{
q = q->next;
j++;      //控制步长
}

}

if(count < n)  //如果count小于 n ,说明有可躲藏点
{

printf("yes, the rabbit have chance of survival, it can hide in the following position:\n");
int j = 0 ;
while( j < n)   //输出标志位sign为0的所有结点
{
if(p->sign == 0)
{
printf("%d\t",p->num);
}
p = p->next;
j++;

}

printf("\n");

}
else
{
printf("no, the rabbit had no chance of survival\n");
}

//开始销毁链表

q = p->next ;

count = 0;

while(count < n-1)
{
free(p);
p = q;
q= p->next;
count++;
}
free(p);

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: