PHP学会网 php培训网 PHP暑期培训 PHP寒假培训 PHP假期培训 » 数据结构和算法 » 约瑟夫环问题
本页主题: 约瑟夫环问题 打印 | 加为IE收藏 | 收藏主题 | 上一主题 | 下一主题

phpwhy

头衔:总管 总管
该用户目前不在线
级别: 管理员
精华: 3
发帖: 633
威望: 550 点
金钱: 5560 PYMB
贡献值: 0 点
在线时间:12(小时)
注册时间:2005-09-15
最后登录:2008-07-15

约瑟夫环问题


问题描述]
编号是1,2,……,n的n个人按照顺时针方向围坐一圈,每个人持有一个密码(正整数)。一开始任选一个正整数作为报数上限值m,从第一个人开始顺时针方向自1开始顺序报数,报到m时停止报数。报m的人出列,将他的密码作为新的m值,从他在顺时针方向的下一个人开始重新从1报数,如此下去,直到所有人全部出列为止。设计一个程序来求出出列顺序。
[基本要求]
利用顺序存储结构模拟此过程,按照出列的顺序输出各个人的编号。

//顺序结构实现
#include  <iostream.h>
#include  <math.h>
void main()
{
    int n,b,m;                //从数组的第b个元素开始报://报到m的人出列;
    int A[]={1,2,3,4,5,6,7,8}; //数组A[]用来盛放原序列;
    int B[8];                //数组B[]用来盛放出列的元素
    n=8;                    //数组长度为8;
    cout<<"输入开始报数位置 b :";
    cin>>b;
    cout<<"输入出列口令 m :";
    cin>>m;
    cout<<"原序列为 :";
    for(int i=0;i<n;i++)  cout<<A<<" ";
    cout<<endl;
    i=0;            //变量i用作数组B[]的下标;
    b=(b+m-2)%n;    //b的意义在此改变,它表示在数组A[]中下标为b的位置上的元素出列;
    while(i<n)      //做循环。负责把数组A[]中报m的元素都出列;
    {
        B=A
        i++;
        if(i==n){  //这一句在B[]满时才执行,负责打印出队序列;
                cout<<"出队序列为:";
                for(i=0;i<n;i++)
                    cout<<B<<"  ";
                return;
                }
        else
        {
              A=0;          //作标记;
              b=(b+1)%n;
              int p=1;
              while(p<m)      //负责找到出队元素前有(m-1)个非零元素;
              {
                if (A==0)    b=(b+1)%n;
                  else  { b=(b+1)%n;
                          p++;
                  }
              } 
        }
   
    while(A==0)    //负责找到当前下一个不为零的元素,为下一次出列做准备;
            b=(b+1)%n;
     
    }
}
你适合当程序员吗?给想学编程的朋友
http://www.phpwhy.com/read.php?tid=5258&page=1&toread=1

  远程免费试听http://www.phpwhy.com/bbs/read.php?tid=4514
学校照片见 http://www.phpwhy.com/bbs/read.php?tid=4091


PHP培训,网站建设咨询
联系电话: 0571-85980046 ,0571-86704910
联系人:何老师
qq:310172
地址:杭州下沙4号路物美西子阳光星城1座501室智达电脑培训中心
顶端 Posted: 2007-06-01 20:22 | [楼 主]
phpwhy

头衔:总管 总管
该用户目前不在线
级别: 管理员
精华: 3
发帖: 633
威望: 550 点
金钱: 5560 PYMB
贡献值: 0 点
在线时间:12(小时)
注册时间:2005-09-15
最后登录:2008-07-15


/*  单向循环链表的经典运用
    Source:blog.csdn.net/panqiaomu *****/
#include<stdlib.h>
#include<stdio.h>
typedef struct Joe...{
    int num;
    struct Joe *next;
}Joe,*cirlist;
/**//*  建立链表按照非逆序的顺序,No Head Node */
cirlist creat(int m)
...{    int i=1;
    cirlist p1,p2,head;
    p2 = (cirlist)malloc(sizeof(Joe));
    if(!p2)
          exit(0);
    head = p2;        /**//* Mark the head pointer  */
    p2->num = 1;
    p2->next = head;
    for(; m-1>0 ; --m)
    ...{      p1 = (cirlist)malloc(sizeof(Joe));
          if(!p1)
                  exit(0);
            p1->num = ++i;
          /**//* Link */
            p2->next = p1;
            p2 = p1;
    }
    /**//* Key step */
    p2->next = head;
    return head;
}
/**//*    开始”屠杀“了 ,每次杀第n个人,Kernel Codes:*/
void Kill(cirlist L,int n)
...{    cirlist pLast,pfree;
    cirlist p = L;
    int count = 1;
    do ...{ // only one node linklist or only one node remainded;
              if(p == p->next)
            ...{    printf("%d  ",p->num);
                return;
            }//if
            ++count;
            pLast = p;// last node;
            p = p->next;
            if(count==n)
            ...{    printf("%d  ",p->num);
                pfree = p;
                pLast->next = p->next;//Link and delete the person
                p = p->next;
                free(pfree);
                count = 1;
            }//if
        }while(count!=n);
}
/**//* Begin testing */
int main()
...{
    cirlist head;
    head = creat(10);
    Kill(head,3);
      system("pause");
    return 0;
}
你适合当程序员吗?给想学编程的朋友
http://www.phpwhy.com/read.php?tid=5258&page=1&toread=1

  远程免费试听http://www.phpwhy.com/bbs/read.php?tid=4514
学校照片见 http://www.phpwhy.com/bbs/read.php?tid=4091


PHP培训,网站建设咨询
联系电话: 0571-85980046 ,0571-86704910
联系人:何老师
qq:310172
地址:杭州下沙4号路物美西子阳光星城1座501室智达电脑培训中心
顶端 Posted: 2007-06-01 20:24 | 1 楼
PHP学会网 php培训网 PHP暑期培训 PHP寒假培训 PHP假期培训 » 数据结构和算法

现在时间:08-09 02:52 Copyright © 2006 phpwhy.com 版权所有
浙ICP备05060669号

点击这里给我发消息关于我们 - 合作联系