Войти

Показать полную графическую версию : избавится от 0 на главной и побочной диагоналях матрицы


Sergey96
09-12-2013, 01:35
когда возможно избавится от 0 все работает а когда нет программа не работает (например матрица 2х2 с 0 не возможно избавится путём перестановки столбцов и рядков матрицы ) вопрос в том как сделать чтоб выводило соответствующие сообщения?
#include <iostream>
#include <time.h>
using namespace std;

int m[10][10];

//===========================================

void set_m (int n)
{

srand((unsigned) time (NULL));

for (int i=0; i<n;i++)
for(int j=0; j<n; j++)

cin>>m[i][j];





for (int i=0; i<n;i++)
{
for(int j=0; j<n; j++)
cout<<m[i][j]<<" ";
cout<<endl;
}
cout<<endl;
}



void look_m(int n) // на осн. диагон. найти 0 и поменять со столбцом или строкой где нет 0
{
for(int i=0, j=0; i<n; i++, j++)
{
if(m[i][j]==0)
{

for(int k=0; k<n; k++)
{
if(m[k][j]!=0)
{
for(int j=0; j<n; j++)
{
int tmp;
tmp=m[i][j];
m[i][j]=m[k][j];
m[k][j]=tmp;
}

}

if(m[i][k]!=0)
{
for(int i=0; i<n; i++)
{
int tmp;
tmp=m[i][j];
m[i][j]=m[i][k];
m[i][k]=tmp;

}

}


}
}
}
}

void look_n(int n) // на побочн. диагон. найти 0 и поменять со столбцом или строкой где нет 0
{
for(int i=n-1, j=0; j<n; i--, j++)
{
if(m[i][j]==0)
{
for(int k=0; k<n; k++)
{
if(m[k][j]!=0)
{
for(int j=0; j<n; j++)
{
int tmp;
tmp=m[i][j];
m[i][j]=m[k][j];
m[k][j]=tmp;
}
//break;
}

if(m[i][k]!=0)
{
for(int i=0; i<n; i++)
{
int tmp;
tmp=m[i][j];
m[i][j]=m[i][k];
m[i][k]=tmp;
//break;
}

}

}
}
}
}


int look(int n) //проверка наличия 0 на диагоналях
{
bool flag=true;
for(int i=0, j=0; i<n; i++, j++)
{
if (m[i][j]==0)
flag=false;
}

for(int i=n-1, j=0; j<n; i--, j++)
{
if (m[i][j]==0)
flag=false;
}

return flag;
}


//==================Output===================================================



void output (int n )
{

for (int i=0; i<n;i++)
{
for(int j=0; j<n; j++)
cout<<m[i][j]<<" ";
cout<<endl;
}

}



int main ()

{
int n;
cin>>n;

set_m(n);

do
{

look_m(n);



look_n(n);

}
while(look(n)==false);
output(n);


system("pause");
}

mrcnn
09-12-2013, 19:36
Перебор с возвратами рекурсивный в данном случае нужен. Так как может получиться ситуация когда после первой перестановки столбцов и строк, на последующих может понадобиться именно
эта переставленная, и тогда задача решаема.




© OSzone.net 2001-2012