Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.05.2011, 21:27   #1
Alina_Honey
Пользователь
 
Регистрация: 14.12.2010
Сообщений: 23
По умолчанию C++ Домик...

Прошу очень о помощи. Вот по программированию задали задачку:
Нарисовать домик, не отрывая карандаша от листа бумаги и не проводя одну и ту же линию дважды.
Требуется найти все возможные варианты рисования домика, начиная с левого нижнего угла. Нумерация вершин дома приведена на рисунке.
Например, следующая последовательность должна быть выдана на экран 153125432.(Рисунок ниже)

Среда Microsoft Visual C++ 6.0.
Изображения
Тип файла: jpg 123456.jpg (3.9 Кб, 195 просмотров)
Alina_Honey вне форума Ответить с цитированием
Старый 05.05.2011, 17:55   #2
Alina_Honey
Пользователь
 
Регистрация: 14.12.2010
Сообщений: 23
По умолчанию

Сначала, я задаю матрицу смежности:
01101
10101
11011
00101
11110
Код:
int a[4][4]=0,1,...,1,1,0;
int j,k,l,i;
Далее с помощью циклов создаю первый проход:
Код:
{for (k=1;k<4; k++)
for(i=0;i<4; i++)
for(j=0;j<4; j++)
{if a[i;j]==1 
{l++;
if l==k
{printf(a[i;j]/n);
a[i;j]=0;
a[j,i]=0;}
}
}
но проблема в том, что после того, как происходит переход например из 1-й вершины во 2-ю, как сделать так, что бы оно не продолжало идти по матрице дальше, а перешло к вершине которую выбрало...?
Помогите...
Alina_Honey вне форума Ответить с цитированием
Старый 06.05.2011, 23:08   #3
Alina_Honey
Пользователь
 
Регистрация: 14.12.2010
Сообщений: 23
По умолчанию

Ну неужели никто не может помочь?...
Alina_Honey вне форума Ответить с цитированием
Старый 06.05.2011, 23:14   #4
Son Of Pain
Участник клуба
 
Регистрация: 23.12.2010
Сообщений: 1,129
По умолчанию

Видимо, никто не может понять сути вопроса.
Son Of Pain вне форума Ответить с цитированием
Старый 07.05.2011, 15:15   #5
Alina_Honey
Пользователь
 
Регистрация: 14.12.2010
Сообщений: 23
По умолчанию

Я задала, что бы по циклу программа начиная с первой вершины по матрице смежности смотрела дальше, соединена ли она с другими, если да, то единички убираются(поскольку мы проходим это ребро) но вместо того, что бы перейти к той вершине, которую программа выбрала, она продолжает идти дальше( поскольку идет цикл). Мне нужна помощь в том, что бы она переходила к вершине, которую выбрала.
Например:
Изначально в программе первая вершина выбрана. Далее по матрице смежности выбирается ребро по которому идем дальше. Например ребро, соединяющее 1-ю и -ю вершины. И по логике дальше нужно выбирать ребро для второй вершины, но программа продолжает идти по этой же вершине... Вот в чем проблема...
Alina_Honey вне форума Ответить с цитированием
Старый 07.05.2011, 16:54   #6
WebbMan
Форумчанин
 
Регистрация: 16.01.2011
Сообщений: 168
По умолчанию

Может поможет:
153125432 = 9 цифр, то есть если цифр>9 или цифр<9 то не подходит. то есть обязательно нужно совершить девять шагов.
Можно где то в цикле проверять на прохождение уже пройденного пути таким способом:
153125432 нет совпадений в переходах значит подходит.
15315 совпадение значит не подходит, пропускаем этот вариант.
Сейчас сама попробую сделать если получиться отпишу.
WebbMan вне форума Ответить с цитированием
Старый 07.05.2011, 17:48   #7
WebbMan
Форумчанин
 
Регистрация: 16.01.2011
Сообщений: 168
По умолчанию

А вот так нельзя? поверька...
сумма верного хода чисел равна 26
153125432 = 26
253215431 = 26
153125432 = 26
делаем циклами любые варианты и проверяем нет ли совпадений типо 15315
WebbMan вне форума Ответить с цитированием
Старый 07.05.2011, 17:49   #8
WebbMan
Форумчанин
 
Регистрация: 16.01.2011
Сообщений: 168
По умолчанию

и еще проверяем строку str = strlen(153125432) на длинну... str = 9
WebbMan вне форума Ответить с цитированием
Старый 07.05.2011, 19:47   #9
Ezhuk
Форумчанин
 
Регистрация: 09.10.2010
Сообщений: 217
По умолчанию

Тут рационально делать рекурсией.
Код:
void fun(int ms[5][5], int pos, int step, int sq[9]) 
{ 

   for(int i=0;i<5;i++)
      int flag=0; 
      if(ms[pos][i]){
           pos=ms[pos][i]; // если возможно идти дальше в pos заносим новую позицию.
           sq[step]=pos;
           if(step>1){
           for(int k=0;k<step-1;k++){ // проверка на прохождение ребер второй раз
                if((sq[i]== pos && sq[i+1]==sq[step]) || (sq[i+1]== pos && sq[i]==sq[step])) {flag=1; break;}
           }
           if (step==8 && flag==0){ 
               for(int i=0;i<9;i++)
                    printf("%d",sq[i]+1);// +1 что обозначения были от 1 до 5
     
               if(flag==0 && step<8) fun(ms,pos,step++,sq); // если флаг 0 то идем дальше
           
      }
}
   
int main(){
    int ms[5][5],pos,step,sq[9]=0;
    ...
    вводим матрицу смежности
    ...
    for(int i=0;i<5;i++){ // определяем исходную точку
         sq[0]=i;
         fun(ms,i,1,sq);}
}
Щас проверить возможности нет. Надеюсь ошибок нет. Как будет возможность проверю.
Можно еще оптимизировтаь убрать переменную pos и работать только с sq, но это переделывать лень 8)
Ёж птица гордая, пока не пнешь не полетит.

Последний раз редактировалось Ezhuk; 07.05.2011 в 20:03.
Ezhuk вне форума Ответить с цитированием
Старый 08.05.2011, 23:33   #10
Alina_Honey
Пользователь
 
Регистрация: 14.12.2010
Сообщений: 23
По умолчанию

Хм... спасибо, попробую)
Alina_Honey вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Basic. Нарисовать домик. Работа с файлом BopCuHka Помощь студентам 1 18.05.2010 23:09