Помогите с логической проблемой - PullRequest
3 голосов
/ 18 марта 2010

Я испытываю большие трудности, пытаясь понять логику этой проблемы. Я разработал все остальное, но я действительно мог бы использовать некоторую помощь, любую помощь, в той части, на которой я застрял.

История вопроса:

* Группа актеров ждет в кругу. Они "считают от "на разные суммы. Последние несколько на прослушивание Считается, что имеют лучший шанс получить части и стать звездами.

Вместо актеров, имеющих имена, их идентифицируют по номерам. «Порядок прослушивания» в таблице говорит, читая слева направо, "имена" актеров, которые будет проходить прослушивание в порядке их исполнения. *

Пример вывода:

альтернативный текст 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);
            }
        }
    }
}

Часть, на которой я застрял, - это математика, которая делает это: альтернативный текст http://content.screencast.com/users/SidSinister/folders/Jing/media/0d178ed4-64bd-468c-acc3-872fa8d8d541/2010-03-17_2035.png

Может кто-нибудь предложить какое-нибудь руководство и / или пример кода?

ПРОГРЕСС ОДИН

Новый код

публичная строка Order (int inter, int num) { // переменная string result = ""; 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;

Проблема: Актеры выключены одним: альтернативный текст http://content.screencast.com/users/SidSinister/folders/Jing/media/6bb7ab47-9d23-47fb-8691-649127afc47b/2010-03-17_2313.png

1 Ответ

2 голосов
/ 18 марта 2010

Основная идея - найти следующего человека с формулой

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

И в каждой итерации меньше людей.

Вот оно в питоне. "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]

1009 * дает *

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...