回 帖 发 新 帖 刷新版面

主题:请各位大侠帮我看一下这个程序

题目是:用数组求解约瑟夫问题,有N个小孩围在一起按顺时钟报数,报到M的小孩从圈子中离开,然后从下一个小孩开始报数,每报到M相应的小孩从圈子中离开,最后一个离开圈子的人为胜者,问胜者是哪一个小孩?

#include<iostream>
using namespace std;
const int N=20,M=5;
int main()
{int children[N],count=1,children_remaind=M,i=0;
 for(i=0;i<N;i++)
    children[i]=i+1;
 while(children_remaind>1)
  {for(i=0;children_remaind>1;i++,count++)
    {if(count==M)
       {for(int m=i;m<children_remaind-1;m++)
           children[m]=children[m+1];
        children_remaind--;
           
        }
     
      count=1;
      if(i>=children_remaind-1)
        i=0;
     }
    
   }
 

cout<<" the winner is No."<<children[0]<<endl;
}

回复列表 (共4个回复)

沙发

//用java写的
//我的思路是这样的:
//1、初始化小孩编号
//2、初始化小孩是否离队标志,这个数组大小为2倍元素数组大小,这样做是为了不再需要每次重建新的数组
//3、生成一个数组用于存放离开小孩的编号。最后进数组的那个小孩是赢家。
//4、每次检验从startId开始到start+20为止的小孩 
//5、找出第key个没离队小孩(标记不为-1)
//6、将这个小孩所在位置的标记置为编号
//7、修改startId
//8、直到remainChild比key小 退出循环

板凳


class Game
{
   static  int lastChildren(int total, int key)
   {
       if (total <= 0 || key <= 0 || key > total)
       {
           return 0;
       }
       //初始化数据
       int[] child = new int[total];  
       for (int i = 0; i < child.length; i++)
       {
           child[i] = i+1;
       }  
  
       int[] childFlag = new int[2 * total]; 
       for (int i = 0; i < childFlag.length; i++)
       {
           childFlag[i] = -1; 
       }                
       
       int[] leaveChildID = new int[total];
       int leaveNum = -1;
       int remainChildNum = total;

       int startId = 0;

       //进行离队检验
       while(remainChildNum >= key)
       {
           int startKey = 0;
           int j = startId;
           //找到第key离队小孩
           for(; j < startId + total; j++)
           {
              if (childFlag[j] == -1)
              {
                 startKey++; 
                 
                 if(startKey == key)
                 {
                     break;
                 }
              }                  
           }
           
           if(startKey == key)
           {
              int findID;
              if (j >= total)
              {
                 findID = j - total;
              }
              else
              {
                 findID = j;
              }
              //重置标记
              childFlag[findID] = child[findID];
              childFlag[findID + total] = child[findID];
              leaveNum++;
              leaveChildID[leaveNum] = child[findID];
              remainChildNum--;
              //System.out.println("---------leaveChildID[leaveNum]---------" + leaveChildID[leaveNum]);
              //新一轮开始
              int nextStart = findID + 1;
              int m = nextStart;
              for(; m < nextStart + total; m++)
              {
                 if (childFlag[m] == -1)
                 {
                     break;  
                 } 
              }
              
              if (m >= total)
              {
                 startId = m - total;
              }
              else
              {
                 startId = m;
              }
           }
       }

       return leaveChildID[leaveNum];
   }

3 楼


   public static void main(String[] args)
   {
       System.out.println(lastChildren(20, 5)); 
      //结果 :
      //---------leaveChildID[leaveNum]---------        5
     //---------leaveChildID[leaveNum]---------        10
     //---------leaveChildID[leaveNum]---------        15
    //---------leaveChildID[leaveNum]---------        20
    //---------leaveChildID[leaveNum]---------        6
    //---------leaveChildID[leaveNum]---------        12
    //---------leaveChildID[leaveNum]---------        18
    //---------leaveChildID[leaveNum]---------        4
    //---------leaveChildID[leaveNum]---------        13
    //---------leaveChildID[leaveNum]---------        1
    //---------leaveChildID[leaveNum]---------        9
    //---------leaveChildID[leaveNum]---------        19
    //---------leaveChildID[leaveNum]---------        11
    //---------leaveChildID[leaveNum]---------        3
    //---------leaveChildID[leaveNum]---------        17
    //---------leaveChildID[leaveNum]---------        16
   }
}

4 楼

赶紧站位,此时不抢更待何时

我来回复

您尚未登录,请登录后再回复。点此登录或注册