主题:请各位大侠帮我看一下这个程序
			
 ndcjhba
				 [专家分:0]  发布于 2010-05-13 23:34:00							
			题目是:用数组求解约瑟夫问题,有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个回复)
		
								
				沙发
				
					
zlongxielinhua [专家分:0]  发布于 2010-05-15 15:07:00				
				//用java写的
//我的思路是这样的:
//1、初始化小孩编号
//2、初始化小孩是否离队标志,这个数组大小为2倍元素数组大小,这样做是为了不再需要每次重建新的数组
//3、生成一个数组用于存放离开小孩的编号。最后进数组的那个小孩是赢家。
//4、每次检验从startId开始到start+20为止的小孩 
//5、找出第key个没离队小孩(标记不为-1)
//6、将这个小孩所在位置的标记置为编号
//7、修改startId
//8、直到remainChild比key小 退出循环
							 
						
				板凳
				
					
zlongxielinhua [专家分:0]  发布于 2010-05-15 15:08:00				
				
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 楼
				
					
zlongxielinhua [专家分:0]  发布于 2010-05-15 15:08:00				
				
   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 楼
				
					
拖拉基斯基 [专家分:0]  发布于 2010-05-22 09:43:00				
				赶紧站位,此时不抢更待何时
							 
									
			
我来回复