利用数组解决约瑟夫环问题

来源:互联网 发布:体育科研数据分析 编辑:程序博客网 时间:2024/05/03 13:41

瑟夫环问题描述:编号为1,2… n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。一开始任选一个正整数作为报数的上限值m,从第一个人开始按顺时针方向自1开始顺序报数, 报到m时停止报数,报m的人出列,将他的密码作为新的m值,从他的顺时针方向上的下一个开始重新从1报数,如此下去,直至所有人全部出列为止,设计一个程 序求出出列顺序。

     我们可以利用数组解决这个问题:

#include <stdio.h>

#define N 7  /*圈里有7个人*/

void main()
{
  /*circle数组的每一个数组元素表示圈内的一个人,元素的第一个域存放密码,第二个域存放与他顺时针

    相邻的人得序号*/

  /*count为计数器,alive为活  着的人数*/
  /*prev上一个报数的人的序号,当前报数人的序号*/
  int circle[N][2], count = 0, alive = N, pre = 0, cur, i, passwd; 

  for(i = 0; i < N; i++)
  {
      circle[i][1] = (i+1) % N;    /*初始化next域*/
  }

  printf("请输入初始密码");     /*输入初始密码*/
  scanf("%d", &passwd);

  printf("请陆续输入圈内%d个人的密码:", i);
  for(i = 0; i < N; i++)                      /*输入密码*/
  {
      scanf("%d", &circle[i][0]);
  }

  /*报数*/
  printf("/n出列顺序为:");
  for(cur = 0; alive != 0; cur = circle[cur][1])
  {
      count++;
     if(count == passwd)
     {
           printf("%d ", cur);
           passwd = circle[cur][0];   /*更改密码*/
           circle[pre][1] = circle[cur][1]; /*前一个人的next域改变*/
           count = 0;       /*报数归0*/
           alive--;       /*活人数目减1*/
     } 
     else
    {
           pre = cur;       /*上一个报数的序号改变*/
    }
  }
}

原创粉丝点击