约瑟夫环 --喝酒问题

 题目:约瑟夫问题(有时也称为约瑟夫斯置换,是一个出现在计算机科学和数学中的问题。在计算机编程的算法中,类似问题又称为约瑟夫环。又称"丢手绢问题".)。

   编号为1.2.3…….n的n个人按顺时针方向围坐一圈,开始任意选一个整数作为报数,从第一个人开始顺时针自1开始顺序报数,报到m时停止报数。报m的人出列,从出列的下一个人开始报数,报到m的人再退出,如此下去直到剩下一个人为止,我们将n=8,m=3,为了更加方便画图。


                    

 

一道题我们将需要的变量找出来之后,但是我们还是写不出来代码,此时是触发点(抓手)太多,故我们可以通过循环从低到高的推到求解,对每一个变量从底层去寻找规律

  1@

    hanhaoshu=1;

    index=1;

    hejiuren[index]=1;

     hanhaoshu=2;

     index=2;

     hejiuren[index]=1;

hanhaoshu=0;

index=0;

对hejiuren    index制0  //如果这一步不理解可以先看2@,再返回看这一步 

 1@  我们可以将其规律总结出来,直接用一个while语句来实现运行

 2@ 

      while(count>0&&count<9)  //此处是判断喝酒的人数还有多少,他有上界和下界

      {

    hanhaoshu++;  //在进行这while这一步的时候,需要提前先将index和hanhaoshu变为0,

    index++;            //进行++之后才能符合题意,我们不能将赋值加到while循环里,这样会

    hejiuren[index];  // 使每一次++变得无效

      }

3@

         while(hanhaoshu[index]==0)

       {

              index++;//当满足条件的时候,说明这个人已经喝醉了,此时这个人已经不算了

              if(index>8)//因为index一直在增加但是  围桌喝酒的人最多只有八个人

                 {

                 index=1; //满足条件将index制1;再进入循环

                 }

       }

4@ 

         if(hanhaoshu==3)

       {

            hejiuren[index]==0;

             printf("%-4d",index);  //此步是去输出圆桌被喝倒的序号

            count--;  //只有8个人喝酒,且一直有人倒下,所以--

            hanhaoshu=0;//此步要返回到原来的2@语句中-->他的作用和1@一样

       }

         

3@和4@包括在2@语句中就会筛选完全合适,也就是去掉2@末尾的‘{’ ,加在4@

                                       代码实现

#include <stdio.h>
#include<string.h>
int main()
{
	int hanhaoshu;
	int hejiuren[8] = { 1,1,1,1,1,1,1,1 };
	for(int i=0;i<8;i++)
	{
	    hejiuren[i];
	}
	for(int i=0;i<8;i++)
	{
	  printf("%-4d",hejiuren[i]);
	}
	printf("\n");
	
	int index;
	index = 0;
	hanhaoshu = 0;
	int count = 8;
	while (count > 0)
	{
		index++;
		hanhaoshu++;
		
		while (hejiuren[index]== 0)
		{
			index++;
			  if(index>8){
			    index = 1; //满足条件将index制1;再进入循环
				 }
		}
		 if(hanhaoshu==3)
		   {
		    hejiuren[index] = 0;
	        printf("%-4d",index);
	        count--;
	         hanhaoshu = 0;//此步要返回到原来的2@语句中-->他的作用和1@一样
		  }
	}


}

                                        

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值