Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
43 / 43 / 14
Регистрация: 16.11.2011
Сообщений: 125
1

Проблемы с очередью

06.12.2011, 15:44. Просмотров 357. Ответов 1
Метки нет (Все метки)

Добрый день уважаемые формучане. У меня возникли проблемы с решением классической задаче о вырезании кусков.

Условие:
Из листа бумаги размером nхn удалили некоторые клетки. На сколько кусков распадется оставшаяся часть листа?
Входной файл: сначала идет число n? затем матрица размеров nxn("x"-клетка вырезана, "." - клетка пуста)

До этого я решал данную задачу, но без помощи очереди. Сейчас решил сделать это так, потому-что в дальнейшем может пригодиться. Но возникает ошибка: при трассировки программы выяснилось, что при выполнении процедуры PutQue на операции Que.x[Que.top]:=x; программа вылетает. Скажите, пожалуйста почему.
Приведу отдельно код процедуры, и полный код программы.

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Type Tstring = record
top,low : integer;
x:array of integer;
y:array of integer;
 end;
 
var     Que: TString;
...
Procedure PutQue(var x,y: integer);
begin
inc(Que.top);
Setlength(Que.x, Que.top);
SetLength(Que.y, Que.top);
Que.x[Que.top]:=x;            
Que.y[Que.top]:=y;            
end;
...
Delphi
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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
Type Tstring = record
        top,low : integer;
        x:array of integer;
        y:array of integer;
     end;
 
var a: array of array of integer;
    N,i,j,z,x,y, sum : integer;
    c:char;
    Que: TString;
    isit :boolean;
    Method : array[1..4] of boolean;
 
Procedure DeleteQue;                  //Очистить очередь
begin
Que.top:=-1;
Que.low:=0;
Setlength(Que.x, 0);
SetLength(Que.y, 0);
end;
 
Procedure PutQue(var x,y: integer);  //Вставить как верхний элемент очереди
begin
inc(Que.top);
Setlength(Que.x, Que.top);
SetLength(Que.y, Que.top);
Que.x[Que.top]:=x;           
Que.y[Que.top]:=y;           
end;
 
Procedure CutLowQue(var x,y: integer); //выоезать нижний элемент очереди
begin
inc(Que.low);
x:=Que.x[Que.low];
y:=Que.y[Que.low];
end;
 
function  IsDelete() : boolean;  Пуста ли очередь.
begin
if Que.top+1=Que.low then isdelete:=true else isdelete:=false;
end;
 
 
Procedure Check;  // Возможные ходы
begin
if (x=0)   or (a[x-1,y]=0) then method[1]:=false else method[1]:=true;
if (y=0)   or (a[x,y-1]=0) then method[2]:=false else method[2]:=true;
if (x=N-1) or (a[x+1,y]=0) then method[3]:=false else method[3]:=true;
if (y=N-1) or (a[x,y+1]=0) then method[4]:=false else method[4]:=true;
end;
 
///////////////////////////////////////////////////////////////////
begin
DeleteQue;
Reset(input, 'input.txt');
Readln(N);
 
SetLength(a, N,N);
for i:=0 to N-1 do
begin
 for j:=0 to N-1 do
 begin
  Read(c);                             //1-вырез 0-чисто
  if c='x' then begin a[i,j]:=1; isit:=true; end else a[i,j]:=0;
 end;
Readln;
end;
 
 
////////////////////////////////////////////////////////////////
sum:=0;
While isit do
begin
isit:=false;
for i:=0 to N-1 do
 for j:=0 to N-1 do
    if a[i,j]=0 then begin x:=i; y:=j; isit:=true; end;
 
if not isit then break;
 
check;
PutQue(x,y);
 
 
 
    while not(IsDelete) do
    begin
      CutLowQue(x,y);
      check;
      if method[1] then begin z:=x-1; PutQue(z, y); a[x-1,y]:=0; end;
      if method[2] then begin z:=y-1; PutQue(x, z); a[x,y-1]:=0; end;
      if method[3] then begin z:=x+1; PutQue(z, y); a[x+1,y]:=0; end;
      if method[4] then begin z:=y+1; PutQue(x, z); a[x,y+1]:=0; end;
 
    end;
 
 
end;
 
Rewrite(output, 'output.txt');
Write(sum);
end.
Заранее спастбо за помощь.

Добавлено через 4 минуты
Немного затупил, сделав массив a типа integer(надо было boolean) - думал, что придется вводить третье значение. Просьба не критиковать, ведь программа и с таким массивом может работать, и расход памяти не так критичен.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.12.2011, 15:44
Ответы с готовыми решениями:

Работа с очередью
Дана очередь действительных чисел. Выведите на печать в начале все числа, меньшие заданного а,...

Выполнение действий с очередью
Заполнить очередь 9 случайными вещественными элементами из промежутка . Найти произведение целых...

Работа с очередью в Delphi
Написал программу на паскале, а препод требует ещё написать на delphi. Нужно уже сдавать, а я не...

Задача со Стеком и Очередью
Доброго времени суток, прошу помочь в решении задачи, ума не приложу как решать её. = (( Дана...

1
43 / 43 / 14
Регистрация: 16.11.2011
Сообщений: 125
09.12.2011, 09:32  [ТС] 2
Upppp
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.12.2011, 09:32

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Как сделать СМО с очередью?С отказами есть
var Form1: TForm1; NN,N,i,Nw:integer; t1,t2,w1,w2,dt,dw,t,Wn,Tw,Wotk,K:real; ...

Работа с очередью
Пишет: Ожидается "." в 33 строке, где 2 end подряд Program Alex; uses crt; type...

Работа с очередью
Как сделать так, чтобы очередь выводила после нуля, 3 случайных числа. Написал программу но числа...

Задача с очередью
Помогите, пожалуйста, с задачей: В очереди стоят три транзакта с номерами 1,2 и3. В момент...


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

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

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