Консультация № 175037
08.12.2009, 21:46
0.00 руб.
0 4 0
Задача:
В заданной квадратной матрице значения некоторых диагональных элементов равняются нулю. Переставить строки или столбцы матрицы таким образом, чтобы диагональные элементы стали ненулевыми. Если это невозможно сделать, вывести соответствующее сообщение.

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


Приложение:
{ program zmas;
uses crt;
var
b:array[1..10] of integer;
a:array[1..10,1..10] OF integer;
n, {size of matrix}
i,iz,jz,j,m:integer; {indexs rov, culumn}
key:char;
flag:boolean;

{=====================output==========================}
procedure output;
begin
for i:=1 to n do
begin
for j:=1 to n do
write( a[i,j], ' ');
writeln;
end;
end;
{====================Change==================}
Procedure CH;
var k:integer;
tmp:integer;
flag:boolean;
begin
Flag:=false;
For i:=iz to n do
begin
If a[i,jz]<>0 then
begin
flag:=true;
for K:=1 to n do
begin
tmp:=a[iz,k];
a[iz,k]:=a[i,k];
a[i,k]:=tmp;
end;
end;
if flag=false then
begin
for i:=1 to iz-1 do
If a[i,jz]<>0 then
begin
flag:=true;
for K:=1 to n do
begin
tmp:=a[iz,k];
a[iz,k]:=a[i,k];
a[i,k]:=tmp;
end;
end;
end;
end;
if flag=false then
writeln('Imposible');


end;
{==============input matrix=========================================}
procedure Inite;
begin
repeat
writeln('input size of matrix');
readln(n);
until n>0;
writeln('input component of matrix');
for i:=1 to n do
for j:=1 to n do
begin
write('a[',i,',',j,']=');
readln (a[i,j]);
end;
writeln('Matrix');
output;
end;

{===================generation element of matrix===========================}
procedure ran;
begin
randomize;
writeln('input size of matrix');
readln(n);
for i:=1 to n do
for j:=1 to n do
a[i,j]:=random(5);
output;
end;
{================im=================}
procedure im;
var k,l:integer;
begin
flag:=false;
{l:=n*n/2; }
for j:=1 to n do
begin
I:=0;
k:=0;
repeat
I:=i+1;
if a[i,j]=0 then k:=k+1;
if k=n then
begin
writeln('imposible');
flag:=true;
end;
until i=n;
if flag=true then break;
end;
for i:=1 to n do
begin
j:=0;
k:=0;
repeat
j:=j+1;
if a[i,j]=0 then k:=k+1;
if k=n then
begin
writeln('imposible ');
flag:=true;
end;
until j=n;
if flag=true then break;
end;
end;

{======================search negativ element==============================}

procedure Zero;
begin
for i:=1 to n do
if a[i,i]=0 then
begin
iz:=i;
jz:=i;
CH;

end;
end;


{=========================================================================}

begin
clrscr;
write('"1":input element of matrix');
writeln(' "2":randomaze element of matrix');

writeln(' For EXIT pres esc ');
writeln('==================================================');
repeat
writeln ('choose command 1-2 or ESC');
key:=readkey;
case key of
'1':Inite;
'2':ran;
end;
im;
if flag=false then
Begin
Zero;
writeln('=======Change matrix============');
output;
end;
until key=#27;
end. }

Обсуждение

Неизвестный
09.12.2009, 13:25
общий
можно переставлять как строки так и столбцы одновременно неограниченное кол-во раз? Потомучто, если можно, то получается, что можно перемешать матрицу как угодно и задача своидтся к счёту кол-ва нулевых элементов, и если их больше n-n*n (где n - размер стороны матрицы), то imposible
Неизвестный
09.12.2009, 18:23
общий
Можно переставлять строки и столбцы неограниченное количество раз!)

Помогите, пожалуйста, доделать задачу)
Благодарю!
Неизвестный
09.12.2009, 18:54
общий
Хммм... поподробнее поразмышлял о задаче, почеркался на листочке, оказывается в первом сообщении я был не прав. Еще один вопросик для уточнения: под "диагональными элементами" ты подразумеваешь только главную диагональ матрицы (линия с элемента 1,1 до n,n) или обе диагонали?
X000
0X00
00X0
000X

или
X00X
0XX0
0XX0
X00X
?
Если только главная диагональ, то решение довольно простое.
Неизвестный
09.12.2009, 20:10
общий
Да нет, тут имеются ввиду и главная, и побочная диагонали.
Форма ответа