2010-03-18 93 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