|
Вопрос # 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);
- begin
- m:=strtoint(edit1.Text);
- n:=strtoint(edit2.Text);
- stringgrid1.ColCount:=m;
- stringgrid1.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] ??????????
 |
Вопрос задал: Тоха (статус: Посетитель)
Вопрос отправлен: 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)
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|