Алгоритм: Определить форму двух секторов очерченных по произвольному пути, а затем заполнить один

голоса
2

Примечание: Это сложная проблема для тех, кто любит логические проблемы и т.д.

Рассмотрим прямоугольную двумерную сетку высотой Н и шириной W. Каждое пространство на сетке имеет значение, либо 0 1или 2. Первоначально каждое пространство на сетке является 0, для пространств вдоль каждого из четырех граней, которые изначально исключение 2.

Затем рассмотрим произвольный путь смежных (горизонтально или вертикально) сетки пространств. Путь начинается на 2и заканчивается на другой 2. Каждое пространство вдоль пути является 1.

Путь делит решетку на два «отрасли» 0пространства. Существует объект , который опирается на неустановленном 0пространстве. «Сектор» , который не содержит объект должен быть полностью заполнен 2.

Определить алгоритм , который определяет пробелы , которые должны стать 2из 0, данный массив (список) значений ( 0, 1или 2) , которые соответствуют значениям в сетке, идя сверху вниз , а затем слева направо. Другими словами, элемент с индексом 0 в массиве содержит значение левого верхнего пространства в сетке (первоначально 2). Элемент с индексом 1 содержит значение пространства в сетке , которая находится в левой колонке, второй сверху, и так далее. Элемент с индексом H содержит значение пространства в сетке , которая находится в верхней строке , а второй с левой стороны , и так далее.

После того , как алгоритм заканчивается и пустой «сектор» полностью заполнен 2с, и тот же алгоритм должен быть достаточным , чтобы сделать тот же процесс снова. Второе (и) время, путь еще выбираемые из 2к другому 2, через пространство 0, но «сетка» меньше , потому что 2s, которые окружены другими 2с не может быть тронут пути (так как путь вдоль пространства 0).

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

Задан 15/05/2010 в 22:07
источник пользователем
На других языках...                            


1 ответов

голоса
3

Мне кажется , что основная заливка алгоритм будет получить работу:

  • Сканирование вашего массива для первого 0вы найдете, а затем начать заливку оттуда, заполняя 0область с некоторым другим числом, скажем , 3- это будет маркировать один из ваших «секторов».
  • Как только это будет сделано, повторите сканирование для 0и заливка оттуда, заполняя 4это время.
  • Во время обоих заливок, вы можете проверить, нашел ли вы ваш объект или нет; в зависимости от того заполнения вы найдете его во время, следить за этот номер.
  • После того как заливка делается, проверьте , насчитывавший регион имел объект в нем - потоп заполнить эту область снова, снова с 0этим временем.
  • Заливка другой пронумерованной области с 2, и вы сделали.

Это будет работать для любой конфигурации сетки, до тех пор , как существует ровно два 0сектора , которые отсоединяются друг от друга; поэтому повторного применения того же алгоритма любое число раз в порядке.

Edit: Мелкие хитрости, чтобы спасти вас от наводнения заливки или два -

  • Если вы не можете найти ваш объект в первом половодья заливкой, можно предположить , что другой сектор, поэтому вы просто повторно заполнить текущий номер с 2и оставить другой сектор в одиночку (так как он уже с 0наполнением).
  • С другой стороны , если вы делаете найти объект в первом половодья заливки, вы можете непосредственно заполнить другой сектор с 2, а затем вновь заполнить первый сектор с 0.
Ответил 15/05/2010 в 22:23
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more