- 描述
-
在一座山上有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;
}
#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;
}