m0_53355897 2021-05-27 13:13 采纳率: 100%
浏览 130
已采纳

c语言的问题求大佬教教

题目描述

围绕着山顶有 m (m <= 1000) 个山洞,兔子和狐狸各住在其中的一个山洞中。狐狸总想吃掉兔子。某一天兔子就对狐狸说:“你想吃我有一个条件,你把山洞用 1 到 m 进行编号,我躲在其中的一个山洞中,你每次间隔 n (n < 1000) 个山洞找我,而且每个山洞只能找一次,直到还剩最后一个山洞。只要不是在剩最后一个山洞找到我,我就让你吃掉!”

问:兔子躲在哪个山洞能保证不被吃掉?

输入描述

一行输入两个正整数,两个数之间用一个空格分开,分别表示山洞数和间隔数。

输出描述

一个整数,占一行,表示安全的山洞编号。

样例输入

9 5

样例输出

8

#include<stdio.h>
# include <string.h>
int main()
{
    int m,n;//m个山洞,间隔n
    while(scanf("%d %d",&m,&n)!=EOF)
	{
		int hole[1001]={0};
		int j,c,t,q;
		j=n;
		
		for(int i=1;i<=m-1;i++)//次数
		{
			c=0;
				if(j<=m)
				{
					hole[j]=1;
					t=j+1;
					q=t;
					while(t<j+n+c)
					{
						if(q>m)
							q=q-m;
						if(hole[q]==1)
							c++;
						q++;
						t++;
					}
					j=j+n+c;
				}
				else
				{
					j=j-m;
					hole[j]=1;
					t=j+1;
					q=t;
					while(t<j+n+c)
					{
						if(q>m)
							q=q-m;
						if(hole[q]==1)
							c++;
						q++;
						t++;
					}
					j=j+n+c;
				}
		
		/*		for(int j=1;j<=m;j++)
		{
				printf("%d ",hole[j]);
		}
				printf("\n");*/
		}
		for(int j=1;j<=m;j++)
		{
			if(hole[j]==0)
				printf("%d\n",j);
		}
	}
	return 0;
}

以上是我写的,改了很多遍还是有错,主要是不能解决每个山洞只能抓一次的问题,请大佬指教!

  • 写回答

1条回答 默认 最新

  • 胖哥王老师 单片机领域新星创作者 2021-05-27 14:54
    关注
    #include <stdio.h>
    #include <ctype.h>
    #include <stdbool.h>
    #include <stdlib.h>
    #include <string.h>
    #include <unistd.h>
    
    
    bool all_holes[1024]; 
    int check_rec=1;
    int check_already=0;
    
    void check_hole(int m,int n)
    {
    	int i=check_rec;
    	int rec=0;
    
    	printf("本次检查从%d号开始\n",check_rec+1);
    	
    	while(rec<n)
    	{
    		if(all_holes[i]==false)
    		{
    			printf("%d号没检查过,跳过它\n",i+1);
    			rec++;
    		}
    		i++;
    		if(i==m)
    		{
    			i=0;
    		}
    	}
    
    	printf("本次检查%d号山洞\n",i+1);
    	
    	while(true)
    	{
    		if(all_holes[i]==false)
    		{
    			all_holes[i]=true;
    			check_already++;
    			break;
    		}
    		i++;
    		if(i==m)
    		{
    			i=0;
    		}
    	}
    	
    	check_rec=i+1;
    	if(check_rec==m)
    	{
    		check_rec=0;
    	}
    }
    
    int main()
    {
        int m=0;
        int n=0;
    	
        int m_check=0;
    
    	int i=0;
    	
    	printf("输入两个数字,表示山洞数和间隔数:\n");
       	scanf("%d %d",&m,&n);
    
    	//初始化,下标0~m-1表示山洞1~m号
    	for(i=0;i<m;i++)
    	{
    		all_holes[i]=false;
    	}
    	
    	check_hole(m,n);
    	
    	while(check_already<m-1)
    	{
    		check_hole(m,n);
    	}
    	
    	for(i=0;i<m;i++)
    	{
    		if(all_holes[i]==false)
    			printf("安全的山洞编号:%d",i+1);
    	}	
        return 0;
    }
    

    从哪里找来的题目,真挺绕脑子的, 

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 求京东批量付款能替代天诚
  • ¥15 slaris 系统断电后,重新开机后一直自动重启
  • ¥15 51寻迹小车定点寻迹
  • ¥15 谁能帮我看看这拒稿理由啥意思啊阿啊
  • ¥15 关于vue2中methods使用call修改this指向的问题
  • ¥15 idea自动补全键位冲突
  • ¥15 请教一下写代码,代码好难
  • ¥15 iis10中如何阻止别人网站重定向到我的网站
  • ¥15 滑块验证码移动速度不一致问题
  • ¥15 Utunbu中vscode下cern root工作台中写的程序root的头文件无法包含