Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Задача о покрытии плоскости тетрадами, рекурсия 
:(
    Опции темы
fuckingniger
Дата 27.2.2011, 23:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 223
Регистрация: 1.10.2010

Репутация: нет
Всего: 1



не могу никак разобраться. есть задание:


Цель работы - исследование класса задач, решаемых полным перебором и методов их решения
 Указания. Используя списковое представление графов и рекурсивные функции, разработать программу, находящую решение, в соответствии с приведенными ниже вариантами. Не разрешается использовать операторы цикла

Тетрада – квадрат, на каждой стороне которого написано некоторое число. Имеется бесконечное количество тетрад нескольких заданных типов. Необходимо вывести все возможные варианты покрытия прямоугольной области заданного размера, избегая повторений. Основное условие – тетрады могут соприкасаться только теми гранями, на которых написаны одинаковые числа.


Вот искал-искал я задачу про эти тэтрады в интернете - не нашёл.Я так понимаю это типичная задача типа ханойских башен.

Может кто знает???

PM MAIL   Вверх
Silent
Дата 28.2.2011, 09:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 252
Регистрация: 3.10.2006

Репутация: нет
Всего: 9



А где задача-то, ее условия?

Если задача звучит как "на прямоугольном поле nxm найти все замощения тетрадами из множества S", то это просто.
Вариант первый - перебираем n*m ячеек, как только заполнили до конца - один из вариантов найден
Код

#include <stdio.h>

const int NMAX = 10;
const int MMAX = 10;
const int KMAX = 100;
int N,M,K;

int A[NMAX*MMAX];
int t[KMAX][4];
int ans = 0;
int tmp,tmpi; //была какая-то трабла с IDE, портила в стеке передаваемые значения, решил не заморачиваться и не искать, а сделать так. Sorry

void init()
{
    scanf("%d %d %d",&N,&M,&K);
    for (int i = 0; i < K; i++)
        for (int j = 0; j < 4; j++)
            scanf("%d",&t[i][j]);
}

void done()
{
    printf("%d",ans);
}

bool Check(int x, int i)
{
    //int x = p;
    if (x < M) // первая строка
    {
        if (x != 0)    //если не первая ячейка, куда можно ставить какой угодно 
            return (t[i][1] == t[A[x-1]][3]);
        else return true;
    }
    else
    {
        tmp = x;
        tmpi = i;
        if (tmp % M == 0)//если находится в первом столбце, то не надо проверять левого соседа
        {
            return (t[tmpi][0] == t[A[tmp-M]][2]);
        }
        else
        {
            return ((t[tmpi][0] == t[A[tmp-M]][2]) &&
                    (t[tmpi][1] == t[A[tmp-1]][3]));
        }
    }
}

void solve(int index)
{
    if (index == N*M) ans++;
    else
        for (int i = 0; i < K; i++)
            if (Check(index,i))
            {
                A[index] = i;
                solve(index+1);
            }
}

int main()
{
    freopen("in.txt", "rt", stdin);
    freopen("out.txt", "wt", stdout);
    init();
    solve(0);
    done();
    return 0;
}

Ну и формат входных данных:
Первая строка N, M, K
В последующих K строках - четыре числа, описывающие тетраду (верхняя, левая, нижняя, правая границы).
Пример входного файла in.txt:
Код

2 2 4
0 1 2 3
6 3 4 5
2 4 7 8
4 8 10 11

Лучше организовать не перебор по тетрадам, а сразу по столбцам, предварительно, конечно, сгенерировав возможные столбцы и их сочетаемость.

P.S. Кстати, просмотрел еще одно условие - "избегая повторений". Но оно легко делается тем, что из исходного множества S (или массива t в коде) убираются одинаковые тетрады
PM MAIL   Вверх
fuckingniger
Дата 1.3.2011, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 223
Регистрация: 1.10.2010

Репутация: нет
Всего: 1



о_О . Это надо переварить.

Это полное условие задания, которое дано.

Добавлено через 3 минуты и 20 секунд
я запустил программу, создав in.txt Но в out выводится либо 1 либо 0 - что это значит?
PM MAIL   Вверх
Silent
Дата 2.3.2011, 17:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 252
Регистрация: 3.10.2006

Репутация: нет
Всего: 9



Каким образом ты получаешь 0? на приведенном мной тесте существует лишь одна расстановка:

| 0 | 6 |
|2  4|3 5|
| 2 | 4 |
------
| 2 | 4 |
|4  8|8 11|
| 7 | 10 |

Или ты не понял формата in.txt?

Алгоритм просто пытается замостить поле, перебирая на текущую позицию все тетрады, тетрада  подходит - позиция смещается, и т.д.

(никак не мог вставить картинку для визуального представления ситуации, накорябал псевдографикой, как сумел)) )

Это сообщение отредактировал(а) Silent - 2.3.2011, 17:15
PM MAIL   Вверх
fuckingniger
Дата 4.3.2011, 00:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 223
Регистрация: 1.10.2010

Репутация: нет
Всего: 1



ну как может быть что я не понял формат). Просто клацаю по файлику)

чтоб добавить картинку сюда необходимо залить её на какой - нить хостинг.например rghost.ru

вставляете сссылку - выделяете и клацаете pic сверху , слева от "цвет"

очень хочу увидеть картинку плз

PM MAIL   Вверх
Silent
Дата 4.3.2011, 11:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 252
Регистрация: 3.10.2006

Репутация: нет
Всего: 9



Есть 4 тетрады, их можно единственным способом сложить в прямоугольник 2х2:
user posted image
PM MAIL   Вверх
xvr
Дата 4.3.2011, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Раскладка неправильная - во внутренней верхней вертикальной грани с 2х сторон 2 разных числа (4 и 3)

PM MAIL   Вверх
Silent
Дата 5.3.2011, 10:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 252
Регистрация: 3.10.2006

Репутация: нет
Всего: 9



Да, действительно, просмотрел. Там должны быть два одинаковых числа, сами выберите какие больше нравятся.


fuckingniger, теперь стало понятнее?
Если да, то второй вариант решения, чуточку быстрее:
1) генерируем все возможные столбцы
2) из сгенерированных столбцов пытаемся собрать решение, опять же перебором

НО, если в качестве ответа надо выводить не варианты решений, а количество, то такое решение (только пункт 2 выполнять не перебором, а динамикой), будет на несколько порядков быстрее, да и верхний потолок гораздо выше.
PM MAIL   Вверх
fuckingniger
Дата 6.3.2011, 13:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 223
Регистрация: 1.10.2010

Репутация: нет
Всего: 1



Silent напиши пожалуйста, что делает solve и что делает check

и где всё-таки в программе массив двумерный, который показывает замощение.
а то я только из двумерных t увидел, а это вроде входные тетрады как я понял.
PM MAIL   Вверх
fuckingniger
Дата 6.3.2011, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 223
Регистрация: 1.10.2010

Репутация: нет
Всего: 1



+ нельзя использовать оператор цикла
PM MAIL   Вверх
fuckingniger
Дата 6.3.2011, 21:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 223
Регистрация: 1.10.2010

Репутация: нет
Всего: 1



в check думаю ошибка 
если аргументы равны то нет смысла 
и уже добавленные тетрады надо как то  исключать


PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0505 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.