Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   избавится от 0 на главной и побочной диагоналях матрицы (http://forum.oszone.net/showthread.php?t=273626)

Sergey96 09-12-2013 01:35 2269169

избавится от 0 на главной и побочной диагоналях матрицы
 
когда возможно избавится от 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 2269515

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


Время: 20:23.

Время: 20:23.
© OSzone.net 2001-