算法 狼找兔子问题

<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;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值