Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
51 / 35 / 4
Регистрация: 14.11.2009
Сообщений: 188
1

Покрасить лабиринт

25.05.2010, 18:51. Показов 1661. Ответов 17
Метки нет (Все метки)

Помогите решить, зачет завтра вообще надо
https://www.cyberforum.ru/algo... 33611.html
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.05.2010, 18:51
Ответы с готовыми решениями:

Покрасить ячейку StringGrid
Доброго времени суток, скажите как мне покрасить ячейку. Например когда я внесу какоето значение в...

Как покрасить Button?
всем привет:) мне нужно покрасить кнопку, как это сделать? я пробовала вот так ...

TChart: как покрасить область на графике, выделенную мышью
Подскажите, как покрасить область на графике выделенную мышью.

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

17
Покинул форум
3184 / 1363 / 109
Регистрация: 29.01.2010
Сообщений: 2,887
25.05.2010, 19:05 2
Проблем в алгоритме или вы не знаете как именно рисовать на форме?
0
51 / 35 / 4
Регистрация: 14.11.2009
Сообщений: 188
25.05.2010, 19:15  [ТС] 3
В алгоритме, я понял что нужно подсчитать количество шагов и потом умножить по условию задачи. Вот как подсчитать? думал в стрингриде сделать заносить 1 пусто 0 стена, посчитать 0. НО там ведь в некоторых местах есть что один ноль за два считать надо например
0
Изображения
 
Покинул форум
3184 / 1363 / 109
Регистрация: 29.01.2010
Сообщений: 2,887
25.05.2010, 20:02 4
Вид лабиринта уже задан на рисунке и вычислять нужно по этому лабиринту?
0
51 / 35 / 4
Регистрация: 14.11.2009
Сообщений: 188
25.05.2010, 20:05  [ТС] 5
нужно чтобы лабиринт можно было редактировать
Вот посмотри я сделал
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
StringGrid1->Options << goEditing << goTabs;
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{  int k=0;
int i,j=0;
    for ( i=0; i<StringGrid1->RowCount; i++ )
    for ( j=0; j<StringGrid1->RowCount; j++ )
         if(StringGrid1->Cells[i][j]== "#")
            {
              k++;
            }
 
 
     Label1->Caption=k;
 
}
//---------------------------------------------------------------------------
Решетки это стены
Считает количество решеток. Можно предположить что 1 решетка равна 1 стене и тогда бы все было хорошо. Но у одной решетки может же быть 2 стены...
0
Тутошний я
2079 / 1145 / 211
Регистрация: 03.11.2009
Сообщений: 4,054
Записей в блоге: 2
26.05.2010, 02:05 6
Проверяет стены вокруг ячейки.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int k=0;
int i,j=0;
    for ( i=0; i<StringGrid1->RowCount; i++ )
    for ( j=0; j<StringGrid1->ColCount; j++ )
         {
           if(StringGrid1->Cells[i-1][j]= "#") k++;
           if(StringGrid1->Cells[i][j+1]= "#") k++;
           if(StringGrid1->Cells[i+1][j]= "#") k++;
           if(StringGrid1->Cells[i][j-1]= "#") k++;
          }
     Label1->Caption=k;
}
Цикл для этой задачи не подходит, он будет проверять и те 2 закрытые ячейки.
P.S.Ответ будет 189, а не 198 как в учебнике.
1
51 / 35 / 4
Регистрация: 14.11.2009
Сообщений: 188
26.05.2010, 03:43  [ТС] 7
Цитата Сообщение от Grey Посмотреть сообщение
Проверяет стены вокруг ячейки.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int k=0;
int i,j=0;
    for ( i=0; i<StringGrid1->RowCount; i++ )
    for ( j=0; j<StringGrid1->ColCount; j++ )
         {
           if(StringGrid1->Cells[i-1][j]= "#") k++;
           if(StringGrid1->Cells[i][j+1]= "#") k++;
           if(StringGrid1->Cells[i+1][j]= "#") k++;
           if(StringGrid1->Cells[i][j-1]= "#") k++;
          }
     Label1->Caption=k;
}
Цикл для этой задачи не подходит, он будет проверять и те 2 закрытые ячейки.
P.S.Ответ будет 189, а не 198 как в учебнике.
Была такая мысль, но выдает ошибку
0
Миниатюры
Покрасить лабиринт  
51 / 35 / 4
Регистрация: 14.11.2009
Сообщений: 188
26.05.2010, 10:13  [ТС] 8
начинал цикл не с 0 а с 1 тогда ошибок не выдает но считает что попало, неправильно...

Добавлено через 5 часов 50 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void __fastcall TForm1::Button2Click(TObject *Sender)
{
int k=0;
int i,j;
  
    for ( i=1; i<6; i++ )
    for ( j=1; j<6; j++ )
         {  
 
           if(StringGrid1->Cells[i][j]== "" && StringGrid1->Cells[i-1][j]== "#") k++;
           if(StringGrid1->Cells[i][j]== "" && StringGrid1->Cells[i][j+1]== "#") k++;
           if(StringGrid1->Cells[i][j]== "" && StringGrid1->Cells[i+1][j]== "#") k++;
           if(StringGrid1->Cells[i][j]== "" && StringGrid1->Cells[i][j-1]== "#") k++;
      
          }
     Label1->Caption=k;
Считает все стены, но нужно чтоб не считал внутреннюю полость...
0
Тутошний я
2079 / 1145 / 211
Регистрация: 03.11.2009
Сообщений: 4,054
Записей в блоге: 2
26.05.2010, 19:25 9
Все таки ответ будет 198. Я 1 стену пропустил.

rid****12345, На твоих "рисунках" написано, что клетки проходят рекурсивно.
Или так, кучей исключений.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int A[10][10];
int k=0;
int i,j=0,b=0;
for ( i=0; i<StringGrid1->RowCount; i++ )
 {
  for ( j=0; j<StringGrid1->ColCount; j++ )
   {
    A[i][j]=4;//заполняем массив 4
   }
 }
for ( i=1; i<StringGrid1->RowCount-1; i++ )//проверяем соседние квадраты
 {
  for ( j=1; j<StringGrid1->ColCount-1; j++ )
   {
    if ( StringGrid1->Cells[i][j]!= "#")
     {
      k=0;
      if(StringGrid1->Cells[i-1][j]== "#") k++;
      if(StringGrid1->Cells[i][j+1]== "#") k++;
      if(StringGrid1->Cells[i+1][j]== "#") k++;
      if(StringGrid1->Cells[i][j-1]== "#") k++;
      A[i][j]=k;//записываем кол-во стен
     }
    if ( StringGrid1->Cells[i][j]== "#")//если стена
     {
      A[i][j]=0;
      StringGrid1->Cells[i][j]= "#";
     }
   }
 }
     Label1->Caption=k;// можно убрать
for ( i=1; i<StringGrid2->RowCount-1; i++ )
 {
  for ( j=1; j<StringGrid2->ColCount-1; j++ )
   {
    StringGrid2->Cells[i][j]=A[i][j];//проверка ячеек(для удобства)
   }
 }
for ( i=1; i<StringGrid1->RowCount-1; i++ )//куча исключений
 {
  for ( j=1; j<StringGrid1->ColCount-1; j++ )
   {
     k=0;
     if(((A[i][j]==3)||(A[i][j]==4))&&(A[i-1][j]==0)&&(StringGrid1->Cells[i-1][j]== "#")) k++;
     if(((A[i][j]==3)||(A[i][j]==4))&&(A[i][j+1]==0)&&(StringGrid1->Cells[i][j+1]== "#")) k++;
     if(((A[i][j]==3)||(A[i][j]==4))&&(A[i+1][j]==0)&&(StringGrid1->Cells[i+1][j]== "#")) k++;
     if(((A[i][j]==3)||(A[i][j]==4))&&(A[i][j-1]==0)&&(StringGrid1->Cells[i][j-1]== "#")) k++;
 
     if (k<2) b=b+A[i][j];
   }
  }
Label2->Caption=IntToStr(b*9);//ответ
}
1
51 / 35 / 4
Регистрация: 14.11.2009
Сообщений: 188
26.05.2010, 20:36  [ТС] 10
Разобрался, маленько не так сделал, но всеравно спасибо за помощ...
0
Покинул форум
3184 / 1363 / 109
Регистрация: 29.01.2010
Сообщений: 2,887
26.05.2010, 21:17 11
rid****12345, так как вы сделали? Я сегодня проснулся, думаю о вашем лабиринте, черт его возьми. Алгоритм я тоже придумал, вот только ту самую полость так и не смог исключить (беда у меня с такими алгоритмами). Так что мне тоже очень интересно посмотреть на решение проблемы....
0
51 / 35 / 4
Регистрация: 14.11.2009
Сообщений: 188
26.05.2010, 21:22  [ТС] 12
Я думаю это НЕ очень хороший вариант. Пришла в голову идея найти тупиковые ситуации и потом их отнять от общего количества, Вот так нахожу:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
for ( i=1; i<6; i++ )
   for ( j=1; j<6; j++ )
         {
           // Если одна клетка полая
           if(StringGrid1->Cells[i][j]== ""
           && StringGrid1->Cells[i-1][j]== "#"
           && StringGrid1->Cells[i][j+1]== "#"
           && StringGrid1->Cells[i+1][j]== "#"
           && StringGrid1->Cells[i][j-1]== "#" ) t=t+4;
         }
 //Если две клетки полые
    for ( i=2; i<6; i++ )
   for ( j=1; j<6; j++ )
         {
           if(StringGrid1->Cells[i][j]== ""
           && StringGrid1->Cells[i-2][j]== "#"
           && StringGrid1->Cells[i][j+1]== "#"
           && StringGrid1->Cells[i+1][j]== "#"
           && StringGrid1->Cells[i][j-1]== "#" ) t=t+3;
         }
 //Если две клетки полые
   for ( i=1; i<6; i++ )
   for ( j=1; j<6; j++ )
         {
           if(StringGrid1->Cells[i][j]== ""
           && StringGrid1->Cells[i-1][j]== "#"
           && StringGrid1->Cells[i][j+2]== "#"
           && StringGrid1->Cells[i+1][j]== "#"
           && StringGrid1->Cells[i][j-1]== "#" ) t=t+3;
         }
    //Если две клетки полые
    for ( i=1; i<6; i++ )
   for ( j=1; j<6; j++ )
         {
           if(StringGrid1->Cells[i][j]== ""
           && StringGrid1->Cells[i-1][j]== "#"
           && StringGrid1->Cells[i][j+1]== "#"
           && StringGrid1->Cells[i+2][j]== "#"
           && StringGrid1->Cells[i][j-1]== "#" ) t=t+3;
         }
    //Если две клетки полые
    for ( i=1; i<6; i++ )
   for ( j=2; j<6; j++ )
         {
           if(StringGrid1->Cells[i][j]== ""
           && StringGrid1->Cells[i-1][j]== "#"
           && StringGrid1->Cells[i][j+1]== "#"
           && StringGrid1->Cells[i+1][j]== "#"
           && StringGrid1->Cells[i][j-2]== "#" ) t=t+3;
         }
1
Тутошний я
2079 / 1145 / 211
Регистрация: 03.11.2009
Сообщений: 4,054
Записей в блоге: 2
29.05.2010, 13:50 13
rid****12345, а если больше 2 полых клеток?

Доконал я этот лабиринт. Мож кому ещё нужен
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
int A[34][34]={{0,0,4,4,4,4,4},//char массив не получается
               {0,1,1,1,1,1,4},
               {4,1,1,1,4,4,4},
               {4,1,1,4,1,1,4},
               {4,1,1,4,4,4,4},
               {4,1,1,1,1,1,0},
               {4,4,4,4,4,0,0}};
int i=1,j=1;//начало лабиринта
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
for (int i=0; i<StringGrid1->RowCount; i++ )//заполняем таблицу
 {
  for (int j=0; j<StringGrid1->ColCount; j++ )
   {
    if (A[i][j]==4) StringGrid1->Cells[j][i]= "#";
    if (A[i][j]==1) StringGrid1->Cells[j][i]= ".";
   }
 }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
int a=0,b=0,r=0;
Memo1->Clear();
for (int k=0;k<100;k++)
{
 if (StringGrid1->Cells[i][j]==".")
  {
   StringGrid1->Cells[i][j]="$";
  }
 L:
 r++;
 a=rand()%3-1;
 b=rand()%3-1;
 if (r>400) goto V;//выход
 if ((a==0)&&(b==0)) goto L;//если эта же клетка
 if (((a==1)&&(b==1))||((a==-1)&&(b==-1))) goto L;//если диагональ
 if (((a==-1)&&(b==1))||((a==1)&&(b==-1))) goto L;//если диагональ
 if((i+a<1)||(j+b<1)||(i+a>StringGrid1->RowCount-1)||(j+b>StringGrid1->ColCount-1)) goto L;//если вышли
 if (StringGrid1->Cells[i+a][j+b]=="#") goto L;//если стена
 else//если не стена
  {
   i=i+a;
   j=j+b;
  }
 if (StringGrid1->Cells[i][j]=="$") goto L;//если были здесь
 Memo1->Lines->Add("i="+IntToStr(i)+"  "+"j="+IntToStr(j));//для удобства
}
V:
int stena=0;
for (int z=1; z<StringGrid1->RowCount-1; z++ )//проверяем соседние квадраты
 {
  for (int c=1; c<StringGrid1->ColCount-1; c++ )
   {
    if ( StringGrid1->Cells[z][c]== "$")
     {
      if(StringGrid1->Cells[z-1][c]== "#") stena++;
      if(StringGrid1->Cells[z][c+1]== "#") stena++;
      if(StringGrid1->Cells[z+1][c]== "#") stena++;
      if(StringGrid1->Cells[z][c-1]== "#") stena++;
     }
   }
 }
Memo1->Lines->Add("stena="+IntToStr(stena*9));//ответ
}
1
Покинул форум
3184 / 1363 / 109
Регистрация: 29.01.2010
Сообщений: 2,887
29.05.2010, 14:04 14
Grey, вам салют!!! У меня бы терпения не хватило бы такое написать!
0
Тутошний я
2079 / 1145 / 211
Регистрация: 03.11.2009
Сообщений: 4,054
Записей в блоге: 2
29.05.2010, 14:20 15
Можно диагональ так
C++
1
if ((a==b)||(a==-b)) goto L;//åñëè äèàãîíàëü
1
51 / 35 / 4
Регистрация: 14.11.2009
Сообщений: 188
29.05.2010, 14:21  [ТС] 16
Grey, По моему уже хватит мучить этот лабиринт!
0
Тутошний я
2079 / 1145 / 211
Регистрация: 03.11.2009
Сообщений: 4,054
Записей в блоге: 2
29.05.2010, 14:28 17
Цитата Сообщение от rid****12345 Посмотреть сообщение
Grey, По моему уже хватит мучить этот лабиринт!
Всё, уже закончил мучить. Интересная была задача.
0
24 / 8 / 17
Регистрация: 22.12.2015
Сообщений: 2,061
04.12.2016, 01:44 18
а как это для консоли VS на чистом СИ реализовать,
Лабиринт представляет собой квадрат, состоящий из n × n сегментов. Каждый из сегментов может быть либо пустым, либо заполненным камнем. Гарантируется, что левый верхний и правый нижний сегменты пусты. Лабиринт обнесен снизу, сверху, слева и справа стенами, которые оставляют свободными только левый верхний и правый нижний углы. Директор лабиринта решил покрасить стены лабиринта, видимые изнутри.
вот вид сверху на лабиринт
Название: 1.jpg
Просмотров: 16

Размер: 9.7 Кб
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.12.2016, 01:44

Игра лабиринт с препятствиями
Здраствуйте.Создаю игру лабиринт,но не простой лабиринт,а с препятствиями.Вот не знаю как добавить...

Сделать лабиринт на основе классов и с графикой на С++ в RAD Studio
ребят ,нужно что бы был лабиринт в котором можно ходить и пройти уровень , сижу думаю над этим но...

Как покрасить конкретный знак в консоли?
Я хочу написать игру в консоли. Карта будет отрисовываться посредством постоянного вывода матрицы,...

Лабиринт
Помогите, пожалуйста, нарисовать лабиринт на всю консоль, чтобы смайлик двигался по лабиринту...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.