Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
 Аватар для riddick12345
51 / 35 / 4
Регистрация: 14.11.2009
Сообщений: 188

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

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

Студворк — интернет-сервис помощи студентам
Помогите решить, зачет завтра вообще надо
https://www.cyberforum.ru/algo... 33611.html
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
25.05.2010, 18:51
Ответы с готовыми решениями:

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

Как покрасить Button?
всем привет:) мне нужно покрасить кнопку, как это сделать? я пробовала вот так Button1->Brush->Style=bsSolid; ...

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

17
Покинул форум
3189 / 1368 / 109
Регистрация: 29.01.2010
Сообщений: 2,887
25.05.2010, 19:05
Проблем в алгоритме или вы не знаете как именно рисовать на форме?
0
 Аватар для riddick12345
51 / 35 / 4
Регистрация: 14.11.2009
Сообщений: 188
25.05.2010, 19:15  [ТС]
В алгоритме, я понял что нужно подсчитать количество шагов и потом умножить по условию задачи. Вот как подсчитать? думал в стрингриде сделать заносить 1 пусто 0 стена, посчитать 0. НО там ведь в некоторых местах есть что один ноль за два считать надо например
Изображения
 
0
Покинул форум
3189 / 1368 / 109
Регистрация: 29.01.2010
Сообщений: 2,887
25.05.2010, 20:02
Вид лабиринта уже задан на рисунке и вычислять нужно по этому лабиринту?
0
 Аватар для riddick12345
51 / 35 / 4
Регистрация: 14.11.2009
Сообщений: 188
25.05.2010, 20:05  [ТС]
нужно чтобы лабиринт можно было редактировать
Вот посмотри я сделал
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
Тутошний я
 Аватар для Grey
2147 / 1202 / 225
Регистрация: 03.11.2009
Сообщений: 4,424
Записей в блоге: 2
26.05.2010, 02:05
Проверяет стены вокруг ячейки.
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
 Аватар для riddick12345
51 / 35 / 4
Регистрация: 14.11.2009
Сообщений: 188
26.05.2010, 03:43  [ТС]
Цитата Сообщение от 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
 Аватар для riddick12345
51 / 35 / 4
Регистрация: 14.11.2009
Сообщений: 188
26.05.2010, 10:13  [ТС]
начинал цикл не с 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
Тутошний я
 Аватар для Grey
2147 / 1202 / 225
Регистрация: 03.11.2009
Сообщений: 4,424
Записей в блоге: 2
26.05.2010, 19:25
Все таки ответ будет 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
 Аватар для riddick12345
51 / 35 / 4
Регистрация: 14.11.2009
Сообщений: 188
26.05.2010, 20:36  [ТС]
Разобрался, маленько не так сделал, но всеравно спасибо за помощ...
0
Покинул форум
3189 / 1368 / 109
Регистрация: 29.01.2010
Сообщений: 2,887
26.05.2010, 21:17
rid****12345, так как вы сделали? Я сегодня проснулся, думаю о вашем лабиринте, черт его возьми. Алгоритм я тоже придумал, вот только ту самую полость так и не смог исключить (беда у меня с такими алгоритмами). Так что мне тоже очень интересно посмотреть на решение проблемы....
0
 Аватар для riddick12345
51 / 35 / 4
Регистрация: 14.11.2009
Сообщений: 188
26.05.2010, 21:22  [ТС]
Я думаю это НЕ очень хороший вариант. Пришла в голову идея найти тупиковые ситуации и потом их отнять от общего количества, Вот так нахожу:
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
Тутошний я
 Аватар для Grey
2147 / 1202 / 225
Регистрация: 03.11.2009
Сообщений: 4,424
Записей в блоге: 2
29.05.2010, 13:50
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
Покинул форум
3189 / 1368 / 109
Регистрация: 29.01.2010
Сообщений: 2,887
29.05.2010, 14:04
Grey, вам салют!!! У меня бы терпения не хватило бы такое написать!
0
Тутошний я
 Аватар для Grey
2147 / 1202 / 225
Регистрация: 03.11.2009
Сообщений: 4,424
Записей в блоге: 2
29.05.2010, 14:20
Можно диагональ так
C++
1
if ((a==b)||(a==-b)) goto L;//åñëè äèàãîíàëü
1
 Аватар для riddick12345
51 / 35 / 4
Регистрация: 14.11.2009
Сообщений: 188
29.05.2010, 14:21  [ТС]
Grey, По моему уже хватит мучить этот лабиринт!
0
Тутошний я
 Аватар для Grey
2147 / 1202 / 225
Регистрация: 03.11.2009
Сообщений: 4,424
Записей в блоге: 2
29.05.2010, 14:28
Цитата Сообщение от rid****12345 Посмотреть сообщение
Grey, По моему уже хватит мучить этот лабиринт!
Всё, уже закончил мучить. Интересная была задача.
0
25 / 9 / 17
Регистрация: 22.12.2015
Сообщений: 2,097
04.12.2016, 01:44
а как это для консоли VS на чистом СИ реализовать,
Лабиринт представляет собой квадрат, состоящий из n × n сегментов. Каждый из сегментов может быть либо пустым, либо заполненным камнем. Гарантируется, что левый верхний и правый нижний сегменты пусты. Лабиринт обнесен снизу, сверху, слева и справа стенами, которые оставляют свободными только левый верхний и правый нижний углы. Директор лабиринта решил покрасить стены лабиринта, видимые изнутри.
вот вид сверху на лабиринт
Название: 1.jpg
Просмотров: 24

Размер: 9.7 Кб
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
04.12.2016, 01:44
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. На мобильном - сканируйте QR-код. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru