Вверх ↑
Этот топик читают: Гость
Ответов: 92
Рейтинг: 1
#1: 2023-07-21 10:50:19 ЛС | профиль | цитата
Всем привет!
Помогите решить задачу.
Есть матрица из 0 и 1. Пример в StrList
0000000000000001000000000000000
0011111111111111111111111111100
0011111111111111111111111111100
0011111111111111111111111111100
0011111111111111111111111111100
0011111111111111111111111111100
0011111111111111111111111111100
0011111111111111111111111111100
0011111111111111111111111111100
0011111111111111111111111111100
0011111111111111111111111111100
0011111111111111111111111111100
0011111100000011111111111111100
0111111101111011111111111111111
0011111101101011111111111111100
0011111101011011111111111111100
0011111101111011111111111111100
0011111100000011111111111111100
0011111111111111111111111111100
0011111111111111111111111111100
0011111111111111111111111111100
0011111111111111111111111111100
0011111111111111111111111111100
0011111111111111111111111111100
0011111111111111111111111111100
0011111111111111111111111111100
0011111111111111111111111111100
0011111111111111111111111111100
0011111111111111111111111111100
0011111111111111111111111111100
0000000000000100000000000000000
Как найти замкнутый периметр квадрата или прямоугольника из 0 и вывести координаты левого верхнего угла?
Заполнен квадрат может быть как 0 так и 1.
Результат этой матрицы должен быть 9,13 стороны: 6,6

Add(StrList,4876793,245,182)
{
Strings=#31:0000000000000001000000000000000|31:0011111111111111111111111111100|31:0011111111111111111111111111100|31:0011011111111111111110111111100|31:0011111111111111111111111111100|31:0011111111110111111111111111100|31:0011111111111111111111111111100|31:0011111111111111111111111111100|31:0011111111111111111111111111100|31:0011111111111111111111111111100|31:0011111111111111111111111111100|31:0011111111111111111111111111100|31:0011100000000011111111111111100|31:0111111101111011111111111111111|31:0011111101011011111111111111100|31:0011111101111000011111111111100|31:0011111001111011111111111111100|31:0011111100000011111111111111100|31:0011111111111011111111111111100|31:0011111111111011111111111111100|31:0011111111111111111111111111100|31:0011110001111111111111111111100|31:0011111111111111111111111111100|31:0011111111111111111111111111100|31:0011111111111111111111111111100|31:0011111111111111111111111111100|31:0011111111111111000111111111100|31:0011111111111111111111111111100|31:0011111111111111111111111111100|31:0011111111111111111111111111100|31:0000000000000100000000000000000|
}
карма: 0

0
Ответов: 8921
Рейтинг: 823
#2: 2023-07-22 00:23:41 ЛС | профиль | цитата
Vandjer, ищем горизонтальные и вертикальные непрерывные линии из "0", в найденных линиях ищем замкнутый контур.
https://disk.yandex.ru/d/7gmPcIiKc6nguA
карма: 19

0
Ответов: 92
Рейтинг: 1
#3: 2023-07-24 09:16:20 ЛС | профиль | цитата
Леонид, Огромнейшее спасибо! Всегда восхищаюсь Вашими решениями. Отлично работает с матрицей без лишних "0" в прямоугольнике.
А вот в этой матрице не находит
Vandjer писал(а):

Add(StrList,4876793,245,182)
{
Strings=#31:000000000000000100000000000000031:0011111111111111111111111111100|31:0011111111111111111111111111100|31:0011011111111111111110111111100|31:0011111111111111111111111111100|31:0011111111110111111111111111100|31:0011111111111111111111111111100|31:0011111111111111111111111111100|31:0011111111111111111111111111100|31:0011111111111111111111111111100|31:0011111111111111111111111111100|31:0011111111111111111111111111100|31:0011100000000011111111111111100|31:0111111101111011111111111111111|31:0011111101011011111111111111100|31:0011111101111000011111111111100|31:0011111001111011111111111111100|31:0011111100000011111111111111100|31:0011111111111011111111111111100|31:0011111111111011111111111111100|31:0011111111111111111111111111100|31:0011110001111111111111111111100|31:0011111111111111111111111111100|31:0011111111111111111111111111100|31:0011111111111111111111111111100|31:0011111111111111111111111111100|31:0011111111111111000111111111100|31:0011111111111111111111111111100|31:0011111111111111111111111111100|31:0011111111111111111111111111100|31:0000000000000100000000000000000|
}

Буду вникать и разбираться с Вашим алгоритмом.
карма: 0

0
Ответов: 8921
Рейтинг: 823
#4: 2023-07-24 10:14:08 ЛС | профиль | цитата
Vandjer, эту ссылку я выкладывал в субботу вечером (когда на хранилище сайта происходило копирование БД) и при попытке залить ответ ничего не происходило, форум выкидывал меня на предыдущее положение. Залить код SHA, файл в список не удавалось, пришлось залить на Яндекс диск и ссылку форум проглотил.
Вот издание 3-е, дополненное и переработанное
https://forum.hiasm.com/getfile/39619
Матрицу в последнем сообщении взять не получилось, повторите.

Редактировалось 1 раз(а), последний 2023-07-24 12:22:06
карма: 19

1
Голосовали:tig-rrr
Ответов: 782
Рейтинг: 168
#5: 2023-07-24 10:22:48 ЛС | профиль | цитата
А если пойти совсем другим путём?

Add(MainForm,2953706,28,112)
{
Width=542
link(onCreate,11440110:doEvent1,[])
}
Add(Img_Point,5839712,420,133)
{
Point(Color)
Point(X)
Point(Y)
Point(Pixels)
link(Bitmap,1557181:Var2,[])
link(X,11493445:NumSubStr,[(440,124)(300,124)(300,180)(209,180)])
link(Y,3623523:Index,[(447,117)(195,117)(195,173)(153,173)])
}
Add(Bitmap,15175649,420,42)
{
HWidth=32
HHeight=32
FillColor=16777215
Point(doCreate)
}
Add(RGN_OutlinePicture,11006533,462,245)
{
ModeTransparent=0
Transparent=0
Point(doPicture)
link(onOutlinePicture,15184077:doGetData,[])
link(SrcBitmap,5487344:ImageBitmap,[])
}
Add(RGN_GetData,15184077,616,245)
{
link(onGetData,7101692:doOperation,[(655,251)(655,258)(564,258)(564,314)])
}
Add(StrList,4876793,126,70)
{
Strings=#31:0000000000000001000000000000000|31:0011111111111111111111111111100|31:0011111111111111111111111111100|31:0011011111111111111110111111100|31:0011111111111111111111111111100|31:0011111111110111111111111111100|31:0011111111111111111111111111100|31:0011111111111111111111111111100|31:0011111111111111111111111111100|31:0011111111111111111111111111100|31:0011111111111111111111111111100|31:0011111111111111111111111111100|31:0011100000000011111111111111100|31:0111111101111011111111111111111|31:0011111101011011111111111111100|31:0011111101111000011111111111100|31:0011111001111011111111111111100|31:0011111100000011111111111111100|31:0011111111111011111111111111100|31:0011111111111011111111111111100|31:0011111111111111111111111111100|31:0011110001111111111111111111100|31:0011111111111111111111111111100|31:0011111111111111111111111111100|31:0011111111111111111111111111100|31:0011111111111111111111111111100|31:0011111111111111000111111111100|31:0011111111111111111111111111100|31:0011111111111111111111111111100|31:0011111111111111111111111111100|31:0000000000000100000000000000000|
}
Add(ArrayEnum,3623523,140,133)
{
link(onItem,11493445:doEnum,[])
link(onEndEnum,2126304:doWork2,[(179,146)(179,195)])
link(Array,4876793:Array,[])
}
Add(Str_Enum,11493445,203,133)
{
Delimiter=""
link(onEnum,4000674:doEvent,[])
}
Add(IndexToChanel,4000674,259,133)
{
Point(Data)
link(onEvent1,10816588:doWork2,[])
link(onEvent2,15667779:doData,[(305,146)(305,160)])
link(Data,11493445:Part,[(265,124)(251,124)(251,173)(216,173)])
}
Add(DoData,15667779,315,154)
{
Data=Integer(16777215)
link(onEventData,10816588:doWork3,[(361,160)])
}
Add(HubEx,10816588,357,133)
{
link(onEvent,5839712:doDraw,[])
}
Add(GetDataEx,1557181,420,91)
{
link(Data,15175649:Bitmap,[])
}
Add(Hub,11440110,84,126)
{
link(onEvent1,15175649:doCreate,[(109,132)(109,62)])
link(onEvent2,3623523:doEnum,[])
}
Add(Image,5487344,462,189)
{
Width=226
Height=261
Align=5
link(Bitmap,1198903:Var2,[])
}
Add(Menu,11513364,280,238)
{
Menu=#22:Найти замкнутый контур|
Point(onSelectNum)
link(onSelectNum,14464684:doDraw,[])
}
Add(Img_FloodFill,14464684,364,245)
{
Color=0
FillType=0
link(onDraw,12673608:doEvent1,[])
link(Bitmap,1198903:Var1,[(370,173)])
}
Add(GetDataEx,1198903,462,168)
{
link(Data,1557181:Var3,[(468,96)])
}
Add(Hub,12673608,406,245)
{
link(onEvent1,2126304:doWork3,[(438,251)])
link(onEvent2,11006533:doPicture,[])
}
Add(HubEx,2126304,434,189)
{
link(onEvent,5487344:doLoad,[])
}
Add(FormatStr,7310973,616,364)
{
DataCount=4
Mask="Отступ слева - %1\r\nОтступ сверху - %2\r\nШирина - %3\r\nВысота - %4"
link(onFString,11848660:doAdd,[])
link(Str1,7101692:Result,[(622,348)(580,348)])
link(Str2,12395156:Result,[])
link(Str3,4259252:Result,[(636,348)(678,348)])
link(Str4,3330308:Result,[(643,355)(727,355)])
}
Add(Memo,11848660,679,364)
{
Left=226
Width=300
Height=261
Align=3
Font=[MS Sans Serif,12,0,0,1]
ScrollBars=3
}
Add(Math,7101692,574,308)
{
OpType=1
Op2=1
link(onResult,12395156:doOperation,[])
link(Op1,15184077:Left,[(580,292)(622,292)])
}
Add(Math,12395156,623,308)
{
OpType=1
Op2=1
link(onResult,4259252:doOperation,[])
link(Op1,15184077:Top,[])
}
Add(Math,4259252,672,308)
{
Op2=2
link(onResult,3330308:doOperation,[])
link(Op1,15184077:Width,[(678,299)(636,299)])
}
Add(Math,3330308,721,308)
{
Op2=2
link(onResult,7310973:doString,[(760,314)(760,405)(606,405)(606,370)])
link(Op1,15184077:Height,[(727,292)(643,292)])
}


P.S. Также не мог попасть на сайт несколько дней.

--- Добавлено в 2023-07-24 10:46:45

Исправил небольшую ошибку.

Add(MainForm,7175195,49,168)
{
Width=542
link(onCreate,11440110:doEvent1,[])
}
Add(Img_Point,5839712,406,189)
{
Point(Color)
Point(X)
Point(Y)
Point(Pixels)
link(Bitmap,1557181:Var2,[])
link(X,9274983:GetData,[(426,180)(398,180)(398,299)(279,299)])
link(Y,3623523:Index,[(433,173)(216,173)(216,229)(174,229)])
}
Add(Bitmap,15175649,406,91)
{
HWidth=32
HHeight=32
FillColor=16777215
Point(doCreate)
}
Add(RGN_OutlinePicture,11006533,539,371)
{
ModeTransparent=0
Transparent=0
Point(doPicture)
link(onOutlinePicture,15184077:doGetData,[])
link(SrcBitmap,5487344:ImageBitmap,[])
}
Add(RGN_GetData,15184077,616,371)
{
link(onGetData,4259252:doOperation,[(662,377)(662,440)])
}
Add(StrList,4876793,147,126)
{
Strings=#31:0000000000000001000000000000000|31:0011111111111111111111111111100|31:0011111111111111111111111111100|31:0011011111111111111110111111100|31:0011111111111111111111111111100|31:0011111111110111111111111111100|31:0011111111111111111111111111100|31:0011111111111111111111111111100|31:0011111111111111111111111111100|31:0011111111111111111111111111100|31:0011111111111111111111111111100|31:0011111111111111111111111111100|31:0011100000000011111111111111100|31:0111111101111011111111111111111|31:0011111101011011111111111111100|31:0011111101111000011111111111100|31:0011111001111011111111111111100|31:0011111100000011111111111111100|31:0011111111111011111111111111100|31:0011111111111011111111111111100|31:0011111111111111111111111111100|31:0011110001111111111111111111100|31:0011111111111111111111111111100|31:0011111111111111111111111111100|31:0011111111111111111111111111100|31:0011111111111111111111111111100|31:0011111111111111000111111111100|31:0011111111111111111111111111100|31:0011111111111111111111111111100|31:0011111111111111111111111111100|31:0000000000000100000000000000000|
}
Add(ArrayEnum,3623523,161,189)
{
link(onItem,11493445:doEnum,[])
link(onEndEnum,2126304:doWork2,[(200,202)(200,321)])
link(Array,4876793:Array,[])
}
Add(Str_Enum,11493445,224,189)
{
Delimiter=""
link(onEnum,4000674:doEvent,[])
}
Add(IndexToChanel,4000674,280,189)
{
Point(Data)
link(onEvent1,10816588:doWork2,[])
link(onEvent2,15667779:doData,[(326,202)(326,216)])
link(Data,11493445:Part,[(286,180)(272,180)(272,229)(237,229)])
}
Add(DoData,15667779,336,210)
{
Data=Integer(16777215)
link(onEventData,10816588:doWork3,[(382,216)])
}
Add(HubEx,10816588,378,189)
{
link(onEvent,5839712:doDraw,[])
}
Add(GetDataEx,1557181,406,147)
{
link(Data,15175649:Bitmap,[])
}
Add(Hub,11440110,105,182)
{
link(onEvent1,15175649:doCreate,[(130,188)(130,111)])
link(onEvent2,3623523:doEnum,[])
}
Add(Image,5487344,539,315)
{
Width=226
Height=261
Align=5
link(Bitmap,12327551:Var2,[])
}
Add(Menu,11513364,357,364)
{
Menu=#22:Найти замкнутый контур|
Point(onSelectNum)
link(onSelectNum,14464684:doDraw,[])
}
Add(Img_FloodFill,14464684,441,371)
{
X=3
Y=3
Color=0
FillType=0
link(onDraw,12673608:doEvent1,[])
link(Bitmap,12327551:Var1,[(447,299)])
}
Add(Hub,12673608,483,371)
{
link(onEvent1,2126304:doWork3,[(515,377)])
link(onEvent2,11006533:doPicture,[])
}
Add(HubEx,2126304,511,315)
{
link(onEvent,5487344:doLoad,[])
}
Add(FormatStr,7310973,616,490)
{
DataCount=4
Mask="Отступ слева - %1\r\nОтступ сверху - %2\r\nШирина - %3\r\nВысота - %4"
link(onFString,11848660:doAdd,[])
link(Str1,15184077:Left,[])
link(Str2,15184077:Top,[])
link(Str3,4259252:Result,[(636,474)(678,474)])
link(Str4,3330308:Result,[(643,481)(727,481)])
}
Add(Memo,11848660,679,490)
{
Left=226
Width=300
Height=261
Align=3
Font=[MS Sans Serif,12,0,0,1]
ScrollBars=3
}
Add(Math,4259252,672,434)
{
Op2=2
link(onResult,3330308:doOperation,[])
link(Op1,15184077:Width,[(678,425)(636,425)])
}
Add(Math,3330308,721,434)
{
Op2=2
link(onResult,7310973:doString,[(760,440)(760,531)(606,531)(606,496)])
link(Op1,15184077:Height,[(727,418)(643,418)])
}
Add(Math,14957917,224,259)
{
OpType=1
Op2=1
link(onResult,9274983:doData,[])
link(Op1,11493445:NumSubStr,[])
}
Add(EventFromData,9274983,273,259)
{
link(onEvent,14957917:doOperation,[(312,265)(312,251)(214,251)(214,265)])
}
Add(GetDataEx,12327551,539,294)
{
link(Data,1557181:Var3,[(545,152)])
}


Редактировалось 1 раз(а), последний 2023-07-24 10:46:45
карма: 15

0
Ответов: 92
Рейтинг: 1
#6: 2023-07-24 10:56:24 ЛС | профиль | цитата
Леонид писал(а):
Матрицу в последнем сообщении взять не получилось, повторите.

Это матрица из первого поста в "StrList"

Gunta писал(а):
А если пойти совсем другим путём?

Gunta, Спасибо! Интересное решение, с одним прямоугольником работает идеально. Но если их несколько (моя ошибка, что не указал в первом посте), то работает некорректно.

Редактировалось 2 раз(а), последний 2023-07-24 11:33:34
карма: 0

0
Ответов: 8921
Рейтинг: 823
#7: 2023-07-24 12:36:51 ЛС | профиль | цитата
Vandjer, ох, в схеме ошибка, забыл включить обработку файла после открытия
Архив перезалил. Можно и ручками добавить один Hub:


Add(MainForm,2953706,91,105)
{
Left=100
Top=50
Width=445
Caption="Matrix01"
link(onCreate,8272637:doWork2,[])
}
Add(MultiElementEx,2494610,210,119)
{
@Hint=#29:Превращение StrList в Матрицу|
link(Count,2085369:Count,[])
link(Arr,2085369:Array,[])
}
BEGIN_SDK
Add(EditMultiEx,6559193,21,21)
{
WorkCount=#6:doMatr|
VarCount=#4:Matr|4:Xcol|4:Ystr|
DataCount=#5:Count|3:Arr|
Width=356
Height=228
VOffset=70
HOffset=34
link(doMatr,947123:doRead,[])
link(Matr,14450593:Var2,[(61,222)(307,222)])
link(Xcol,13670951:CountCol,[(68,229)(314,229)])
link(Ystr,13670951:CountRow,[(75,236)(321,236)])
}
Add(Length,1331799,119,91)
{
link(onLength,3941055:doCalc,[])
}
Add(ArrayRW,947123,63,91)
{
link(onRead,1331799:doLength,[])
link(Array,2280922:Var2,[])
link(Index,824067:Value,[])
}
Add(Memory,824067,70,42)
{
Default=Integer(0)
}
Add(Matrix,13670951,301,91)
{
Point(CountCol)
Point(CountRow)
}
Add(MathParse,3941055,168,91)
{
MathStr="%1 + %2*65536"
link(onResult,7362094:doEvent1,[])
link(X2,6559193:Count,[(181,33)(61,33)])
}
Add(Hub,7362094,217,91)
{
OutCount=3
link(onEvent1,13670951:doSize,[])
link(onEvent2,13670951:doClear,[])
link(onEvent3,4107787:doEnum,[(242,111)(242,132)(39,132)(39,181)])
}
Add(MatrixRW,16109978,252,168)
{
link(Matrix,14450593:Var1,[(258,131)])
link(Value,1162643:Result,[(265,152)(195,152)(195,215)(153,215)])
link(X,12667478:Result,[(272,159)(244,159)(244,215)(209,215)])
link(Y,4107787:Index,[(279,145)(90,145)(90,215)(62,215)])
}
Add(ArrayEnum,4107787,49,175)
{
link(onItem,2460900:doEnum,[])
link(Array,2280922:Var1,[(55,82)])
}
Add(Str_Enum,2460900,98,175)
{
Delimiter=""
link(onEnum,1162643:doOperation,[])
}
Add(Math,12667478,203,175)
{
OpType=1
Op2=1
ResultType=0
link(onResult,16109978:doWrite,[])
link(Op1,2460900:NumSubStr,[(209,166)(139,166)(139,215)(104,215)])
}
Add(Math,1162643,147,175)
{
ResultType=0
link(onResult,12667478:doOperation,[])
}
Add(GetDataEx,2280922,63,77)
{
link(Data,6559193:Arr,[])
}
Add(GetDataEx,14450593,301,126)
{
link(Data,13670951:Matrix,[])
}
END_SDK
Add(StrList,2085369,203,56)
{
@Hint=#8:Ищем "0"|
Point(doLoad)
}
Add(Button,14667318,77,56)
{
Left=140
Top=5
Width=40
Caption="Откр"
link(onClick,3021643:doExecute,[])
}
Add(ODialog,3021643,119,56)
{
Filter="TXT|*.txt"
link(onExecute,11753445:doEvent1,[(158,62)(158,90)])
}
Add(Hub,11753445,168,84)
{
link(onEvent1,2085369:doLoad,[])
link(onEvent2,8272637:doWork1,[(193,97)])
}
Add(HubEx,8272637,189,119)
{
link(onEvent,2494610:doMatr,[])
}

карма: 19

0
7
Сообщение
...
Прикрепленные файлы
(файлы не залиты)