Перейти к содержанию
СофтФорум - всё о компьютерах и не только

Процедура удаления висячих чисел в массиве


Рекомендуемые сообщения

Вот написал процедуру для удаления "висячих" чисел в двумерном массиве 20х20. Вроде работает на тестовом файле, а когда вставляю в прогу (подобие тетриса), то там она не хочет работать и все!

Вопрос: В чем дело????

Сама процедура для отладки:

program sssss;const N=20;type matr=array[1..N,1..N] of integer;var mas:matr; i,j,t,k:integer; f:boolean;  f1,f2,f3:text; ch:char;beginassign (f1,'D:\test\f1.txt');assign (f2,'D:\test\f2.txt');assign(f3,'D:\test\f3.txt');rewrite(f2);rewrite(f3);reset(f1);for i:=1 to N dofor j:=1 to N do read(f1,mas[j,i]);k:=0;for i:=1 to N dobeginfor j:=1 to N do write(f3,mas[j,i],' '); writeln(f3,'------');end;writeln(f3,'konez');for i:=1 to (N-1) dofor j:=1 to N do begin if mas[j,i]<>0 then  begin  for t:=1 to (N-j) doif mas[j+t,i]<>0 then k:=k+1 else break;  for t:=0 to k dobeginif mas[j+t,i+1]<>0 then f:=true;if f=true then break;end;  if f=false thenfor t:=0 to k do begin mas[j+t,i+1]:=mas[j+t,i]; mas[j+t,i]:=0; end;  end; k:=0; end;for i:=1 to N dobeginfor j:=1 to N do write(f2,mas[j,i],' '); writeln(f2,'------');end;writeln(f2,'konez');close(f2); close(f3); readln;end.

Сама процедура:

procedure strb(var mas:matr);const N=20;var i,j,t,k:integer; f:boolean;begink:=0;for i:=1 to (N-1) dofor j:=1 to N do begin if mas[j,i]<>0 then  begin  for t:=1 to (N-j) doif mas[j+t,i]<>0 then k:=k+1 else break;  for t:=0 to k dobeginif mas[j+t,i+1]<>0 then f:=true;if f=true then break;end;  if f=false thenfor t:=0 to k do begin mas[j+t,i+1]:=mas[j+t,i]; mas[j+t,i]:=0; end;  end; k:=0; end;end;

Контест программы:

 for i:=1 to 20 do  for j:=1 to 20 doBEGINif ((mas[j,i]<>0)and(mas[j,i]=mas[j+1,i-1])and(mas[j,i]=mas[j+2,i-2])and(mas[j,i]=mas[j+3,i-3])) then  begin  Outtextxy(90,90,'diagprav');  dpr:=dpr+1;  shore:=shore+150;  Outshore(shore);  for j2:=j to (j+3) do   for i2:=i downto 4 do   beginmas[j2,i2]:=mas[j2,i2-1-(j2-j)];for index:=1 to (1+j2-j) do mas[j2,index]:=0;   end;  {===================}  istr(mas); strb(mas);  obn_ekr(mas);  { =======================}  end;END;
Ссылка на комментарий
Поделиться на другие сайты

Ну например

1 5 0 0 0

0 0 0 0 4

3 3 3 3 3

1 и 5 - висячие числа, т.е. под ними стоят нули. Надо эти числа переместить вниз, пока под ними не будет стоять число!

Ссылка на комментарий
Поделиться на другие сайты

Бумер:

Ну например

1 5 0 0 0

0 0 0 0 4

3 3 3 3 3

1 и 5 - висячие числа, т.е. под ними стоят нули. Надо эти числа переместить вниз, пока под ними не будет стоять число!

Удаление "висячих" чисел в любой матрице можно сделать одним оператором, ниже пример. Оператор for i:=1... (он записан в 5 и 6 строках) решает задачу, остальные строки - задание тестовых данных и вывод их и результатов теста (я взял данные твоего примера, это легко изменить).
const s=3;c=5;a:array[1..s,1..c]of integer=((3,3,3,3,3),(0,0,0,0,4),(1,5,0,0,0));var i,j,k:integer;beginfor j:=s downto 1 do begin for i:=1 to c do Write(a[j,i]); WriteLn end;WriteLn;for i:=1 to c do for j:=1 to s-1 do if a[j,i]=0 then for k:=j+1 to s do if a[k,i]<>0 then begin a[j,i]:=a[k,i];a[k,i]:=0;break end;for j:=s downto 1 do begin for i:=1 to c do Write(a[j,i]); WriteLn end;WriteLn;Writeln; ReadLnend.

Тут s - число строк матрицы, c - число ее столбцов (колонок). Числа в каждом стоблце сдвигаются к его началу. Поскольку у тебя в тетрисе самой нижней строке логично дать номер (индекс) 1, то в тесте матрица выводится так же, как в тетрисе, то есть первая строка матрицы внизу (поэтому в цикле используется downto, а не to).

Алгоритм "подтаскивания" элементов к началам столбцов можно было бы сделать и оптимальнее, но для тетриса вполне сойдет.

Изменено пользователем Тролль
Ссылка на комментарий
Поделиться на другие сайты

Тролль, извини, но похоже ты меня не так понял (я виноват - даже объяснить нормально не умею).

В общем, у меня экран по массиву обновляется. Массив 20 на 20

процедура обновления:


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

1.JPG

post-34963-1176015775_thumb.jpg

Ссылка на комментарий
Поделиться на другие сайты

да и еще, вообще то такая процедура есть - она в моем первом посте(strb), мне непонятно, почему она не работает в проге, если работает на тестовом примере???

У меня в проге - j - столбцы, а i - строки. Первым считается левый верхний квадратик.

Ссылка на комментарий
Поделиться на другие сайты

По рисунку не всё ясно:

Элементы всегда горизонтальные полоски по два элемента? Если нет, то как отличить один элемент от другого, например, четыре клетки по горизонтали - это две полоски рядом или одна полоска из четырех клеток?

Зачем они раскрашены, имеет ли какое-нибудь значение цвет?

При каждом выполнении процедуры они должны сдвигаться вниз только на один уровень или должны сразу достигать низшей точки?

Ссылка на комментарий
Поделиться на другие сайты

Бумер: так, значит теория графов, я немного уточню про "висячие" числа. :)

1. Матрица графа - симметричная с нулевой главной диагональю.

2. Ограф - это ориентированный граф.

3. В ографе степень исхода вершины совпадает со степенью и называется степенью вершины. Вершины со степенью, равной 1, называются висячими.

Бумер Так ты про орографы (ографы) спрашиваешь?

Ссылка на комментарий
Поделиться на другие сайты

Тролль:

Линии всегда горизонтальные, цвет не имеет значения - как синие, так и красные и зеленые и желтые - все они должны падать!

Процедура должна либо сдвигать вниз на одну единицу за один проход и тогда мы будем ее юзать несколько раз, пока обнаруживаются числа, как бы висящие в воздухе, либо сразу опускает вниз но не до упора, а до первой заполненой клетки, а если таковой нет то до самого низа!

Indomito: К сожалению у нас дискретка только началась и я немного не понимаю о чем речь (лучше бы сказать что я вообще ничего не понял из того что ты написал), но посмотри же скрин и ты поймещ, что висячие - это те, которые как бы в воздухе висят и ни на что не опираются!

Тролль, вы посмотрите на процедуру в моем первом посте (вариант для отладки) - она (по-моему) успешно справляется с поставленной задачей (можешь откомпилировать и посмотреть в файлы!). НО!!!!!! Меня больше всего интересует вопрос, почему она не работает в самой программе?????

Ссылка на комментарий
Поделиться на другие сайты

Бумер:

Честно говоря, с программами, написанными другими, разбираться всегда намного сложнее, чем написать программу заново. Дело в том, что программа придумывается в голове на русском языке и потом переводится на Pascal или С по типу "переберем все колонки... угу, for j:=1 to N do ...". А с чужими программами, мало того, что надо сначала переводить на русский, надо еще пытаться понять, зачем это делалось: "for j:=1 to N do ... угу, перебираем все колонки... А зачем это, интересно, ему тут понадобилось? ".

Кроме того, автор программы знает, чего хотел, а тот, кто разбирается - не всегда. Например, ты мне так и не ответил, всегда ли длина полоски равна двум клеткам, могут ли быть две полоски находиться рядом, всегда ли они лежат горизонтально... А если я всего этого не знаю, как я могу сказать, даже разобравшись в программе, это то, что ожидалось, или совсем наоборот? :sly:

Да, так к нашим конкретным баранам. Как я понял по тексту твоей процедуры, она должна просматривать по порядку все строки с верхней до второй снизу включительно, и если найдет в строке полоску ненулевых элементов, то проверить лежащие под ней элементы и, если все места под полоской незаняты, перенести полоску на строку ниже.

Так бы она, скорее всего, и делала, если бы не проблемы с переменной f. У нее не только нет определенного начального значения, но и, хоть раз получив значение true, она его изменить на false (например, для работы со следующей полоской или строкой) может разве что при ударе в компьютер молнии :D .

Попробуй после оператора for t:=1 to (N-j) do if mas[j+t,i]<>0 then k:=k+1 else break; вставить f:=false;

Попутно, для порядка, еще раз хочу заметить, что выражения типа "if f=true then ..." режут глаз. В переводе на русский "если это истинно, что это истина, то ..." Гораздо лучше просто сказать "если это истинно, то ...", то есть на Паскале "if f then ..."

Indomito:

Это не имеет отношения к висячим вершинам. Бумер просто использовал это слово как придуманное им обозначение для ненулевых элементов матрицы, непосредственно под которыми находятся нулевые элементы - будучи, видимо, не в курсе, что слово "висячие" используется в теории графов. Его величество случайное совпадение :blink: .

Изменено пользователем Тролль
Ссылка на комментарий
Поделиться на другие сайты

Тролль: ну понимаешь, вед это понятие (висячие) дали в институте, не сам же он их придумал, а? Тогда законный вопрос о компетентности препода, который сиё так обозвал. :blink:

Ссылка на комментарий
Поделиться на другие сайты

Indomito: Дык дело в том, что Тролль, как всегда, прав. Это понятие я САМ придумал, чтобы как нибудь попонятнее объяснить что я имею в виду, а то это у меня очень плохо получается!!!

Indomito: Дык дело в том, что Тролль, как всегда, прав. Это понятие я САМ придумал, чтобы как нибудь попонятнее объяснить что я имею в виду, а то это у меня очень плохо получается!!!

Тролль, подправил как ты сказал и все работает! Большое тебе спасибо!

Ссылка на комментарий
Поделиться на другие сайты

Бумер:

Тролль, подправил как ты сказал и все работает! Большое тебе спасибо!
что я такого сказал то? ;) Ну, тогда и тебе спасибо ;)
Ссылка на комментарий
Поделиться на другие сайты

Indomito:

Не знал, что ты тоже тролль :) . Но если так - вдвойне приветствую :( !

P.S. Хотя мог бы догадаться. Читаю твой аватар "Кто я? Форматцевт? НЕТ! Indomito? НЕТ!" :) Значит, ТРОЛЛЬ! :)

Ссылка на комментарий
Поделиться на другие сайты

Тролль: ну .... да аватар подвёл, хотя я хочу продолжить, но вывод " Я ТРОЛЛЬ?" -"НЕТ!" :)

Ссылка на комментарий
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...