forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   2D-программирование (http://forum.boolean.name/forumdisplay.php?f=13)
-   -   Массивы (http://forum.boolean.name/showthread.php?t=7860)

HolyDel 02.03.2009 21:01

Ответ: Массивы
 
скорее всего у тебя двумерный массив. в таком случае можно воспользоваться проекцией на одномерный. как то так:

size_x - размер поля по горизонтали
size_y - размер поля по вертикали
a - массив

Код:

n = size_x * size_y
for i = 1 to n
 cnt = 0
 x = i mod size_x
 y = i / size_x

 if a(x,y)<>0
  for j = i+1 to n
  x2 = j mod size_x
  y2 = j / size_x

  if a(x,y) = a(x2,y2) then cnt = cnt +1
  next
 endif

 if cnt >= 3
  val = a(x,y)
  for j=n to i step -1
  x2 = j mod size_x
  y2 = j / size_x

  if a(x2,y2) = a(x,y) then a(x2,y2)=0
  next
 endif

next


avel 03.03.2009 03:48

Ответ: Массивы
 
епть... как все запущенно-то... *многадумаю* надо будет написать туториал по массивам чтоли... да и вообще по основным алгоритмам...

Randomize 03.03.2009 08:28

Ответ: Массивы
 
и по BlitzMax напиши, а то я там много чего недопонял.
хелп там не изобилует примерами.
А примеры хелпом.

Petrofan 03.03.2009 11:18

Ответ: Массивы
 
Все равно не выходит сделать удаление ячеек можно как нибудь с комментариями для того чтоб хотя бы понять что там происходит?

Randomize 03.03.2009 13:30

Ответ: Массивы
 
http://forum.boolean.name/showthread...9439#post99439
Я там немного пописал по теме.
Почитайте немножко ту тему по ссылке, может всё станет на свои места.

Petrofan 03.03.2009 14:02

Ответ: Массивы
 
Это я уже знаю меня интересует вопрос перебора и удаления
Вот допустим перебором я могу считать сколько на карте одинаковых элементов
For i = 0 To 7
For j = 0 To 7
If Map(i,j)=1 Then img=img+1
next
next
Каким образом найти рядом стоящие 3 ячейки и удалить их?

jimon 03.03.2009 16:40

Ответ: Массивы
 
Petrofan
таксь, от простого к сложному

есть масив чисел 1,4,8,2,2,6,3,2,2,2,7,9,1 (размер n, индексы от 0 до n-1)
нужно определить есть ли в них три подряд одинаковых числа,
если есть то найти индекс (позицию) первого числа из этого ряда

записываем базовое условие которое надо проверить : a[i] = a[i+1] = a[i+2]
где a это наш масив, i это индекс первого елемента из трёх равных между собой елементов

решение задачи - проверить базовое условие для всех елементов масива
там где базовое условие выполняется, то по индексу i находится первый из трёх одинаковых елементов

базовые слова из решения - проверить условие для всех елементов, тоесть ЦИКЛ !

теперь определимся с границами цикла, если равные первые три то индекс первого елемента будет 0, значит левая граница 0
если равные последние три индекс третего елемента будет n-1, второго елемента n-2, первого елемента n-3
значит у нас цикл от 0 до n-3

basic и подобные языки не позволяют проверять на равенство три числа сразу, потому нам надо чтобы одновременно выполнялись 1=2 и 2=3
вот буква и и есть названием комманды - and (с англ "и")
тоесть наше условие теперь выглядит так (a[i] = a[i+1]) and (a[i+1] = a[i+2])

результат будем хранить в переменной i_result

пишем наш цикл :
1) первоначальные установки, если трёх подряд елементов нету то мы получим отрицательный индекс
Код:

i_result = -1
2) сначала заголовок цикла
Код:

for i = 1 to n-3
3) потом наше условие
Код:

if (a[i] = a[i+1]) and (a[i+1] = a[i+2]) then
4) если условие выполняется то пишем ответ
Код:

i_result = i
5) и закрываем цикл
Код:

next
получаем вот такой код
Код:

i_result = -1
for i = 0 to n-3
if (a[i] = a[i+1]) and (a[i+1] = a[i+2]) then i_result = i
next

в переменной i_result у нас будет индкс первого елемента из трёх равных между собой елементов

теперь задача именно тебе, найти индексы первых елементов из трёх равных между собой елементов во всех строках и столбцах 2д масива что у тебя есть

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

Petrofan 03.03.2009 17:55

Ответ: Массивы
 
У меня двумерный массив заполнен случайными значениями. Я могу это сделать так?
If (Map(i,j) = Map(i+1,j)) And (Map(i+1,j) = Map(i+2,j)) Then i_result = i

jimon 03.03.2009 18:10

Ответ: Массивы
 
Petrofan
можешь

Petrofan 03.03.2009 19:14

Ответ: Массивы
 
Вот так работает удаляет три одинаковых по вертикали и по горизонтали ячейки х0-х1-х2 и y0-y1-y2.

For i = 0 To 8-8
For j = 0 To 8-8
If (Map(i,j) = Map(i+1,j)) And (Map(i+1,j) = Map(i+2,j)) Then i_result = i
If (Map(i,j) = Map(i,j+1)) And (Map(i,j+1) = Map(i,j+2)) Then j_result = j
If i_result = i Then Map(i,j)=0 Map(i+1,j)=0 Map(i+1,j)=0 Map(i+2,j)=0
If j_result = j Then Map(i,j)=0 Map(i,j+1)=0 Map(i,j+1)=0 Map(i,j+2)=0
Next
Next


Этот метод по моему плохой по вертикали и по горизонтали будет очень много вариантов и все надо будет прописывать. А другого варианта нет?

Petrofan 04.03.2009 12:43

Ответ: Массивы
 
То что есть другие варианты или я неправильно что то делаю ?

HolyDel 04.03.2009 12:52

Ответ: Массивы
 
наверное не:
Код:

For i = 0 To 8-8
For j = 0 To 8-8

а:
Код:

For i = 0 To 8-3
For j = 0 To 8-3


Petrofan 04.03.2009 13:22

Ответ: Массивы
 
Да не работает и все хоть волком вой. Эти массивы начинают нервировать.

HolyDel 04.03.2009 14:21

Ответ: Массивы
 
Код:

Graphics3D 640,480,32,2
SeedRnd MilliSecs()

Dim map(8+3,8+3)

For i=0 To 7
        For j=0 To 7
                map(i,j)=Rand(1,3)
        Next
Next

While Not KeyDown(1)
       
        If KeyHit(57)
                i_result = -1
                j_result = -1
                For i = 0 To 8
                        For j = 0 To 8
                                If (map(i,j) = map(i+1,j)) And (map(i+1,j) = map(i+2,j)) Then i_result = i
                                If (map(i,j) = map(i,j+1)) And (map(i,j+1) = map(i,j+2)) Then j_result = j
                               
                                If (i_result>=0)
                                        map(i,j)=0 map(i+1,j)=0 map(i+1,j)=0 map(i+2,j)=0
                                        i_result = -1
                                EndIf
                               
                                If (j_result>=0)
                                        map(i,j)=0 map(i,j+1)=0 map(i,j+1)=0 map(i,j+2)=0
                                        j_result = -1
                                EndIf
                               
                        Next
                Next
        EndIf
        For i=0 To 7
                For j=0 To 7
                        Color (map(i,j)=1)*255,(map(i,j)=2)*255,(map(i,j)=3)*255
                        Rect i*32,j*32,30,30,1
                Next
        Next
        Flip
Wend


Petrofan 04.03.2009 14:57

Ответ: Массивы
 
HolyDel - а ты умный спасибо за помощь !


Часовой пояс GMT +4, время: 03:44.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot