| 
| 
 | Вопрос # 2 982/ вопрос решён / | 
 |  Здравствуйте! уважаемые эксперты...помогите пожалуйсто....у меня есть двумерный массив a[i,j] и мне нужно заполнить его так,чтобы для любого а[i,j] существовал хотябы один a[s,t]<d
 (d- некоторое число),   где i-1<=s<=i+1   и  j-1<=t<=j+1
 
 я так понял что в одном из 3 близлежащих чисел должнобыть хотябы одно которое меньше d.....
 
 вот начало я
 Приложение:Переключить в обычный режим procedure TForm1.Button1Click(Sender: TObject);beginm:=strtoint(edit1.Text);n:=strtoint(edit2.Text);stringgrid1.ColCount:=m;stringgrid1.RowCount:=n;end; procedure TForm1.Button2Click(Sender: TObject);beginfor i:=0 to m dofor j:=0 to n doSTRINGgrid1.Cells[i,j] ??????????
|  |   Вопрос задал: Тоха (статус: Посетитель)Вопрос отправлен: 11 июля 2009, 04:20
 Состояние вопроса: решён, ответов: 2.
 |  Ответ #1. Отвечает эксперт: Паровоз Здравствуйте, Тоха!Если мое предположение правильно, тогда можно сделать так:
 const
 n=5;
 m=10;
 d=20;
 type
 TA=array[1..n,1..m] of string;
 var
 a,b: TA;
 //матрица 'a' нам дана
 procedure DoTask(var a,b:TA);
 var
 i,j:Integer;
 begin
 for i:=1 to n do
 for j:=1 to m do
 if (i=1)or(i=n)or(j=1)or(j=m)or(StrToInt(a[i,j])>=d)
 then b[i,j]:='XX'
 else b[i,j]:=a[i,j];
 end;
 //в матрице 'b' результат
 
|  | Ответ отправил: Паровоз (статус: 10-ый класс)Время отправки: 13 июля 2009, 14:07
 Оценка за ответ: 5
 |  Ответ #2. Отвечает эксперт: Мережников Андрей Здравствуйте, Тоха!в своем последнем сообщении, в строке if a[i,j]
пример функции mycheck в приложении
 Приложение:Переключить в обычный режим function mycheck(i,j:integer;d:real;m,n:integer):boolean;var s,t:integer;begin  Result:=false;  for s:=max(i-1,0) to min(m,i+1)  do for t:=max(j-1,0) to min(n,j+1);       do if (s<>i)and(j<>t)and(a[s,t]<d) then Result:=true;end;
|  | Ответ отправил: Мережников Андрей (статус: Абитуриент)Время отправки: 13 июля 2009, 21:01
 Оценка за ответ: 5
 |  
 Мини-форум вопросаВсего сообщений: 17; последнее сообщение — 15 июля 2009, 22:35; участников в обсуждении: 4. 
|   | Мережников Андрей (статус: Абитуриент), 11 июля 2009, 08:51 [#1]:генерируйте числа для заполнения в диапазоне 0..d-1 и условие будет выполняться всегда. Не совсем верно утверждение про 3 соседних числа. В общем случае речь идет о 8 числах. Например, элемент [4,5]значит проверять надо следующие элементы: [3,4],[3,5],[3,6],[4,4],[4,6],[5,4],[5,5],[5,6].
 Проверка трех чисел - это крайние случаи для элементов [1,1],[1,m],[n,1],[m,n]
 |  11 июля 2009, 09:31: Вопрос перемещён из тематического раздела Delphi » Общие вопросы по программированию в раздел Delphi » Алгоритмы, преобразования модератором Ерёмин А.А. 
|   | Тоха (статус: Посетитель), 11 июля 2009, 12:38 [#2]:ну у мя задача состиоит в том чтоб в матрице выделять подмножество элементов которые <d а еси так делать то они все меньше получаются...ды и в условии написано хотя бы одно из для любогоa[i,j] существует хотябы один элемент a[s,t]...... |  
|   | Мережников Андрей (статус: Абитуриент), 12 июля 2009, 15:55 [#3]:так уточните задачу - заполнить массив определенным образом, или найти в нем элементы, удовлетворяющие приведенному условию |  
|   | Тоха (статус: Посетитель), 12 июля 2009, 20:24 [#4]:пишу полное условие задачи: дана матрица целых чисел размером mXn Составить программу выделяющую в матрице подмножество элементов удовлетворяющих: 1) a[i,j]<d     2)для любого a[i,j] удовлетворяющ условию 1 существует хотябы один элемент a[s,t], такой что i-1<=s<=i+1 и j-1<=t<=j+1
 |  
|   | Тоха (статус: Посетитель), 12 июля 2009, 20:24 [#5]:помогите плз чем можете( |  
|   | Вадим К (статус: Академик), 12 июля 2009, 22:15 [#6]:читал несколько раз условие. Такое ощущение, что половину слов выбросили. Не собирается в кучу это условие у меня в голове. Я думаю, что в половины экспертов тоже.
 Галочка "подтверждения прочтения" - вселенское зло. |  
|   | Паровоз (статус: 10-ый класс), 12 июля 2009, 22:35 [#7]:Неясен смысл второго условия. Вы ищете элемент a[i,j], а потом пишите, что он любой. |  
|   | Тоха (статус: Посетитель), 13 июля 2009, 09:37 [#8]:(((( ну вот такая попалась незнаю....( |  
|   | Тоха (статус: Посетитель), 13 июля 2009, 10:02 [#9]:ну я вот как делал..пытался рандомом сначала заполнит а потом ести при рандоме есть a[i,j]<d то через цыкл я хотел сделать чтобы появлялся a[s,t],d.... |  
|   | Паровоз (статус: 10-ый класс), 13 июля 2009, 10:58 [#10]:Это только в сказках можно пойти туда не знаю куда и все что нужно сделать. Давайте попробуем такой вариант: 2) существует хотябы один элемент матрицы a[s,t], такой что i-1<=s<=i+1 и j-1<=t<=j+1
 В этом случае условие равносильно тому, что элемент a[i,j] не лежит на границе матрицы, т.е. i не равно 1 и n, а j не равно 1 и m.
 Годится?
 |  
|   | Тоха (статус: Посетитель), 13 июля 2009, 19:03 [#11]:вот я сёня к преподу ездил...он сказал что вот так:  дана матрица размером m на n нужно сделать программу которая выделяет из этой матрицы ( лучше подсвечивает) a[i,j] которые меньше d И в окт\рестностях которого есть хотя бы одно число a[s,t]<d  а те a[i,j] которые меньше d но не имеют в окрестности  a[s,t]<d не выделяются..врод всё понятно а как  эт сделать.. 
 вот код мой начальный
 
 var
 Form1: TForm1;
 s,d,i,j,m,n,t:integer;
 a:array[0..100,0..100] of integer;
 implementation
 
 {$R *.dfm}
 
 procedure TForm1.Button1Click(Sender: TObject);
 begin
 m:=strtoint(edit1.Text);
 n:=strtoint(edit2.Text);
 stringgrid1.ColCount:=m;
 stringgrid1.RowCount:=n;
 stringgrid2.ColCount:=m;
 stringgrid2.RowCount:=n;
 stringgrid3.ColCount:=m;
 stringgrid3.RowCount:=n;
 end;
 
 procedure TForm1.Button2Click(Sender: TObject);
 begin
 for i:=0 to m do
 for j:=0 to n do
 STRINGgrid1.Cells[i,j]:=inttostr(random(100));
 end;
 
 procedure TForm1.Button3Click(Sender: TObject);
 begin
 for i:=0 to m do  for j:=0 to n do
 a[i,j]:=strtoint(stringgrid1.Cells[i,j]);
 d:=strtoint(edit3.Text);
 for i:=0 to m do  for j:=0 to n do
 if a[i,j]<d then stringgrid2.Cells[i,j]:=floattostr(a[i,j]) else stringgrid2.Cells[i,j]:='Не удовлетворяет условию';
 
 
 end;
 
 это он просто выделяет a[i,j]<d а надо чтоб он выделял только те у которых есть a[s,t]<d т.е в окрестностях его есть элемент меньше d
 |  
|   | Мережников Андрей (статус: Абитуриент), 13 июля 2009, 21:03 [#12]:почему-то ответ при отправке обрезался: в строке if a[i,j]
добавьте and mycheck(i,j,d,m,n) |  
|   | Тоха (статус: Посетитель), 14 июля 2009, 17:23 [#13]:не знаю..чёт эти не выполняются (((вот как я сделал 
 for i:=0 to n do
 for j:=0 to m do
 if (a[i,j]>=d)or((a[i,j]<d) and(a[i-1,j-1]>d) and(a[i,j-1]>d)and(a[i-1,j]>d)and(a[i,j+1]>d)and(a[i+1,j]>d)and(a[i-1,j+1]>d)and(a[i+1,j-1]>d)and(a[i+1,j+1]>d))
 then stringgrid3.Cells[i,j]:='XX'
 else stringgrid3.Cells[i,j]:=inttostr(a[i,j]);
 
 но он не выполняет по контуру..
 |  
|   | Паровоз (статус: 10-ый класс), 14 июля 2009, 20:11 [#14]:У Вас с контуром проблемы потому, что число строк и столбцов равно не n и m, а n+1 и m+1 (так как отсчет ведется с нуля). Исправьте строки stringgrid1.ColCount:=m;
 stringgrid1.RowCount:=n;
 stringgrid2.ColCount:=m;
 stringgrid2.RowCount:=n;
 stringgrid3.ColCount:=m;
 stringgrid3.RowCount:=n;
 увеличив их правые части на 1.
 |  
|   | Паровоз (статус: 10-ый класс), 14 июля 2009, 20:16 [#15]:А вообще условие проверки у Вас какое-то подозрительное. Проверять его просто лень. Возьмите такое: 
   for i:=0 to m do for j:=0 to n do
    if (i>0)and(i<m)and(j>0)and(j<n)and(a[i,j]<d)and(a[i-1,j]<d)and
       (a[i+1,j]<d)and(a[i,j-1]<d)and(a[i,j+1]<d)
    then stringgrid3.Cells[i,j]:=floattostr(a[i,j])
    else stringgrid3.Cells[i,j]:='XX'; |  
|   | Тоха (статус: Посетитель), 15 июля 2009, 22:31 [#16]:всё я доделал...там нада было ещё проверить угловые значения и кой чё изменить..ну вот что получилось.. procedure TForm1.Button1Click(Sender: TObject);
 begin
 m:=strtoint(edit1.Text);
 n:=strtoint(edit2.Text);
 stringgrid1.ColCount:=m;
 stringgrid1.RowCount:=n;
 stringgrid3.ColCount:=m;
 stringgrid3.RowCount:=n;
 end;
 
 procedure TForm1.Button2Click(Sender: TObject);
 begin
 for i:=0 to m-1 do
 for j:=0 to n-1 do
 STRINGgrid1.Cells[i,j]:=inttostr(random(100));
 end;
 
 procedure TForm1.Button4Click(Sender: TObject);
 begin
 d:=strtoint(edit3.Text);
 for i:=0 to m-1 do
 for j:=0 to n-1 do
 a[i,j]:=strtoint(stringgrid1.Cells[i,j]);
 
 i:=0;
 for j:=1 to n-2 do
 if (a[i,j]<d)and((a[i,j-1]<d)or(a[i,j+1]<d)or(a[i+1,j]<d)or(a[i+1,j-1]<d)or(a[i+1,j+1]<d))
 
 then  stringgrid3.Cells[i,j]:=inttostr(a[i,j])
 else  stringgrid3.Cells[i,j]:='XX' ;
 
 i:=m-1;
 for j:=1 to n-2 do
 if (a[i,j]<d)and((a[i-1,j-1]<d)or(a[i,j-1]<d)or(a[i-1,j]<d)or(a[i,j+1]<d)or(a[i-1,j+1]<d))
 
 then  stringgrid3.Cells[i,j]:=inttostr(a[i,j])
 else  stringgrid3.Cells[i,j]:='XX' ;
 
 j:=0;
 for i:=1 to m-2 do
 if (a[i,j]<d)and((a[i-1,j]<d)or(a[i,j+1]<d)or(a[i+1,j]<d)or(a[i-1,j+1]<d)or(a[i+1,j+1]<d))
 
 then  stringgrid3.Cells[i,j]:=inttostr(a[i,j])
 else  stringgrid3.Cells[i,j]:='XX' ;
 
 j:=n-1;
 for i:=1 to m-2 do
 if (a[i,j]<d)and((a[i-1,j-1]<d)or(a[i,j-1]<d)or(a[i-1,j]<d)or(a[i+1,j]<d)or(a[i+1,j-1]<d))
 
 then  stringgrid3.Cells[i,j]:=inttostr(a[i,j])
 else  stringgrid3.Cells[i,j]:='XX' ;
 
 
 
 всем спасибо кто помогал...)
 |  
|   | Тоха (статус: Посетитель), 15 июля 2009, 22:35 [#17]:i:=0;j:=0; if (a[i,j]<d)and((a[i,j+1]<d)or(a[i+1,j]<d)or(a[i+1,j+1]<d))
 then  stringgrid3.Cells[i,j]:=inttostr(a[i,j])
 else  stringgrid3.Cells[i,j]:='XX' ;
 
 i:=0;j:=n-1;
 if (a[i,j]<d)and((a[i,j-1]<d)or(a[i+1,j]<d)or(a[i+1,j-1]<d))
 then  stringgrid3.Cells[i,j]:=inttostr(a[i,j])
 else  stringgrid3.Cells[i,j]:='XX' ;
 
 j:=0;i:=m-1;
 if (a[i,j]<d)and((a[i-1,j]<d)or(a[i,j+1]<d)or(a[i-1,j+1]<d))
 then  stringgrid3.Cells[i,j]:=inttostr(a[i,j])
 else  stringgrid3.Cells[i,j]:='XX' ;
 
 j:=n-1; i:=m-1;
 if (a[i,j]<d)and((a[i-1,j-1]<d)or(a[i,j-1]<d)or(a[i-1,j]<d))
 then  stringgrid3.Cells[i,j]:=inttostr(a[i,j])
 else  stringgrid3.Cells[i,j]:='XX' ;
 
 for i:=1 to m-2 do
 for j:=1 to n-2 do
 if (a[i,j]<d)and((a[i-1,j-1]<d)or(a[i,j-1]<d)or(a[i-1,j]<d)or(a[i,j+1]<d)or(a[i+1,j]<d)or(a[i-1,j+1]<d)or(a[i+1,j-1]<d)or(a[i+1,j+1]<d))
 then  stringgrid3.Cells[i,j]:=inttostr(a[i,j])
 else  stringgrid3.Cells[i,j]:='XX' ;
 end;
 
 end.
 |  31 января 2011, 19:36: Статус вопроса изменён на решённый (изменил модератор Ерёмин А.А.): Автоматическая обработка (2 и более ответов с оценкой 5) Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |