描述

在一座山上有n个山洞(每个洞从0~n-1分别编号),这山上有一只兔子躲在山洞里,有一只狼,从编号为0的山洞开始入洞,每隔m个洞,再次入洞抓兔子,现在问,兔子能否避免这场灾难?

例如:m=2 and n=6, 狼将要进入的山洞号为:0,2,4,0;

输入
有多组测试数据,不超过1000组;
每组有两个整数m,n(0<m,n<=1000);
注意:程序以文件结束符“EOF”结束输入。
输出
兔子能避免这场灾难输出YES,否则输出NO;
样例输入
1 2
2 2
样例输出
NO
YES
分析
只要有一个洞狼没有进去,则兔子能逃过
本题可以用循环链表做,建立循环链表进行解题
View Code
#include<stdio.h>
#include
<malloc.h>
#define LEN sizeof(node)
struct node
{
int num;
node
*next;
};
node
*creat(int n) //建立链表
{
node
*head;
node
*p1,*p2;
p1
=p2=(node*)malloc(LEN);
head
=NULL;
int i=1,t=0;p1->num=i;
for(i=0;i<n;i++)
{
t
++;
if(t==1)head=p1;
else p2->next=p1;
p2
=p1;
p1
=(node*)malloc(LEN);
p1
->num=i;
}
p2
->next=head;
return head; //返回头指针
}
int main()
{
int m,n,k,i;
node
*head,*p1,*p2;
while(scanf("%d%d",&m,&n)!=EOF)
{
head
=creat(n);
p2
=p1=head;
k
=1;
while(1)
{
for(i=0;i<m;i++)
{
p2
=p1;
p1
=p1->next;
}
//在当前节点处往后寻找节点
if(n==1&&p1->num!=-1)
{
k
=0;
break;
}
if(p1->num==-1) //如果循环后在没有将所有洞都进入过,就到达了一个
break; //已经进入过的洞,则必定有洞狼不会进去,则兔子能逃过
n--;
p1
->num=-1;//狼进入一个洞后,将其值置为-1
}
if(k==0)
printf(
"NO\n");
else printf("YES\n");
}
return 0;
}

  

posted on 2011-07-05 20:37  pcoda  阅读(534)  评论(0编辑  收藏  举报