【问题标题】:Help with a logic problem帮助解决逻辑问题
【发布时间】:2010-03-18 00:38:04
【问题描述】:

我很难弄清楚这个问题背后的逻辑。我已经开发了其他所有东西,但我真的可以使用一些帮助,任何形式的帮助,我坚持的部分。

背景故事:

*一群演员围成一圈等待。他们“数 关”的不同数量。最后几个试镜 被认为最有可能获得 零件和成为明星。

演员不是有名字的,而是被识别出来的 按数字。表中的“试听顺序”告诉我们, 从左到右阅读,演员的“名字” 将按照他们将执行的顺序进行试听。*

样本输出:

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

谁能提供一些指导和/或示例代码?

进展一

新代码

public string Order(int inter, int num) { //多变的 字符串结果 = ""; 整数位置 = 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

【问题讨论】:

  • 听起来像是功课!我记得在课堂上用不同的措辞做这个确切的问题。我不记得解决方案,但它不是难。坚持下去!
  • 基本上我只需要了解如何循环一个数组的索引并从中减去元素。
  • 这通常被称为约瑟夫斯问题...

标签: c# logic


【解决方案1】:

基本思路是用公式找到下一个人

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

【讨论】:

  • 嗨,马克,感谢您的帮助。它肯定走了很长一段路,因为我的程序快完成了。我仍然有一个问题。我的演员们差了一个……似乎找不到它在做什么。你能看看我上面所做的编辑吗?
猜你喜欢
  • 2010-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-15
  • 2023-04-06
  • 1970-01-01
  • 2011-03-07
相关资源
最近更新 更多