2010-03-18 56 views
3

我在試圖找出這個問題背後的邏輯時遇到了很大的困難。我已經開發了一切,但我真的可以使用一些幫助,任何幫助,我堅持的部分。有關邏輯問題的幫助

背景故事:

*一羣演員了一圈等待。他們「計數 」以不同的金額。最後幾次試鏡 被認爲是獲得零件併成爲明星的最佳機會。

取代具有名字的演員,他們通過數字被標識爲 。 「勁舞團訂單」表中的講述, 閱讀左到右,該誰 將在他們將執行順序試鏡演員的「名稱」 *

輸出示例:

alt text http://content.screencast.com/users/SidSinister/folders/Jing/media/2f6de635-c1d1-48fa-b868-68f4e298bf16/2010-03-17_2033.png

等,一路攀升至10

我有什麼至今:

using System; 
using System.Collections; 
using System.Text; 

namespace The_Last_Survivor 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      //Declare Variables 
      int NumOfActors = 0; 
      System.DateTime dt = System.DateTime.Now; 
      int interval = 3; 
      ArrayList Ring = new ArrayList(10); 

      //Header 
      Console.Out.WriteLine("Actors\tNumber\tOrder"); 

      //Add Actors 
      for (int x = 1; x < 11; x++) 
      { 
       NumOfActors++; 

       Ring.Insert((x - 1), new Actor(x)); 

       foreach (Actor i in Ring) 
       { 
        Console.Out.WriteLine("{0}\t{1}\t{2}", NumOfActors, i, i.Order(interval, x)); 
       } 

       Console.Out.WriteLine("\n"); 
      } 

      Console.In.Read(); 
     } 

     public class Actor 
     { 
      //Variables 
      protected int Number; 

      //Constructor 
      public Actor(int num) 
      { 
       Number = num; 
      } 

      //Order in circle 
      public string Order(int inter, int num) 
      { 
       //Variable 
       string result = ""; 
       ArrayList myArray = new ArrayList(num); 

       //Filling Array 
       for (int i = 0; i < num; i++) 
        myArray.Add(i + 1); 

       //Formula 
       foreach (int element in myArray) 
       { 
        if (element == inter) 
        { 
         result += String.Format(" {0}", element); 
         myArray.RemoveAt(element); 
        } 
       } 
       return result; 
      } 

      //String override 
      public override string ToString() 
      { 
       return String.Format("{0}", Number); 
      } 
     } 
    } 
} 

我被卡住的部分正在得到一些數學會這樣做: alt text http://content.screencast.com/users/SidSinister/folders/Jing/media/0d178ed4-64bd-468c-acc3-872fa8d8d541/2010-03-17_2035.png

任何人都可以提供一些指導和/或示例代碼?

PROGRESS ONE

新代碼

公共字符串訂單(INT間,INT NUM) { //可變 字符串結果= 「」; int pos = 0; ArrayList myArray = new ArrayList();

  //Filling Array 
      for (int i = 0; i < num + 1; i++) 
       myArray.Add(i+1); 

      while (myArray.Count > 1) 
      { 
       pos = (pos + inter) % myArray.Count; 
       result += (myArray[pos] + " "); 
       myArray.RemoveAt(pos); 
      } 


      result += (myArray[0]); 
      myArray.Clear(); 
      return result; 

問題:演員是關閉一個: alt text http://content.screencast.com/users/SidSinister/folders/Jing/media/6bb7ab47-9d23-47fb-8691-649127afc47b/2010-03-17_2313.png

+0

聽起來像功課!我記得在課堂上用不同的措辭來做這個確切的問題。我不記得解決方案,但它不是很難。只要堅持下去! – Cameron 2010-03-18 00:39:25

+0

基本上我只需要了解如何循環一個數組的索引,並從中減去元素。 – Stradigos 2010-03-18 00:39:27

+0

這通常被稱爲約瑟夫斯問題... – 2010-03-18 03:19:13

回答

2

的基本想法是,你找旁邊的人用公式

next position = (current position + count) modulo number of people 

而且每次迭代中有少一個人。

這裏是在Python中。 「count」是2,因爲我們從零開始計數,這使幾乎所有涉及模數的問題都變得簡單一些。

people=[1,2,3,4,5] 
people=['a','b','c','d','e'] 
count=2 # base 0 counting 

pos=0 
while len(people) > 1: 
    pos = (pos + count) % len(people) 
    print "at pos",pos,"eliminating person",people[pos],'from',people, 
    del people[pos] 
    print 'leaving',people 
print 'winner is',people[0] 

at pos 2 eliminating person c from ['a','b','c','d','e'] leaving ['a','b','d','e'] 
at pos 0 eliminating person a from ['a','b','d','e'] leaving ['b','d','e'] 
at pos 2 eliminating person e from ['b','d','e'] leaving ['b','d'] 
at pos 0 eliminating person b from ['b','d'] leaving ['d'] 
winner is d 
+0

嗨馬克,感謝您的幫助。由於我的程序幾乎完成,它確實走了很長的路。我仍然有一個問題。我的演員被一個... ...似乎無法找到它在做什麼。你可以看看我上面做的編輯嗎? – Stradigos 2010-03-18 03:18:12

+0

沒關係!修復! – Stradigos 2010-03-18 03:20:24