Сложная задача по C++. Тема: сортировка матрицы (двумерного массива)
Задан одномерный массив чисел, его значения надо передать квадратной матрице но так чтобы в строках и столбцах числа не повторялись.
Количество элементов в массиве предусматривает возможность создания квадратной матрицы. То есть если чисел 9 то матрица будет 3 на 3, если 25 то 5 на 5.
while(true)
{ // бесконечный цикл
system("cls"); // очищаем экран
cout << "Введите количество элементов" << endl;
cin >> m;
if (sqrt(m) == (long long)sqrt(m))break; //Проверка что корень - целое число
}
Количество повторяющихся элементов не может превышать корня всех элементов. То есть если чисел 9 то повторений может быть максимум 3 (как количество строк и столбцов).
while(true){
cout << "Введите массив" << endl;
for(int i=0; i<m; i++)
{
while (!(cin>>(mas[i])) || (cin.peek() != '\n'))
{
check ();
}
}
int repeat=0;
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
{
if(mas[i] == mas[j]) repeat++;
}}
if (n >= repeat)break;
else{cout << "Из данных чисел невозможно построить матрицу удовлетворяющую условию задания" << endl;}
}
Мой код но без самой сортировки:
#include <iostream>
#include <cmath>
#include <cstdlib>
#include <iomanip>
using namespace std;
void check ()
{
cin.clear();
while (cin.get() != '\n');
cout << "Ошибка ввода!" << endl;
cout << "Повторите ввод!" << endl;
}
int main()
{
while(true){ // бесконечный цикл
system("cls"); // очищаем экран
setlocale(LC_ALL, "");
int m;
//-------------------
while(true)
{ // бесконечный цикл
system("cls"); // очищаем экран
cout << "Введите количество элементов" << endl;
while (!(cin >> m) || (cin.peek() != '\n'))
{
check ();
}
if (sqrt(m) == (long long)sqrt(m))break;
}
//-------------------
int n=sqrt(m);
int mas[m];
//-------------------
while(true){
cout << "Введите массив" << endl;
for(int i=0; i<m; i++)
{
while (!(cin>>(mas[i])) || (cin.peek() != '\n'))
{
check ();
}
}
int repeat=0;
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
{
if(mas[i] == mas[j]) repeat++;
}}
if (n >= repeat)break;
else{cout << "Из данных чисел невозможно построить матрицу удавлеворяющую условию задания" << endl;}
}
//---------------------------------------Проверка массива
cout << "---------------" << endl;
for(int i=0; i<m; i++)
{
cout<<mas[i];
}
cout << "---------------" << endl;
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
//------------------------------------ В данной части требуется помощь
m=0;
int *mat[n][n];
for(int i=0; i<(n); i++)
for(int j=0; j<(n); j++)
{
if (mat[i][j]){
mat[i][j]=&mas[m];
m++;}
}
cout << "---------------" << endl;
for(int i=0; i<(n); i++)
{
for(int j=0; j<(n); j++)
cout<<(*mat[i][j])<<"\t";
cout<<"\n";
}
cout << "---------------" << endl;
//------------------------------------
int menu;
cout<<""<<endl;
cout<<"Выполнить программу еще раз? (1-да, 2-нет)\n";
cin>>menu;
if(menu!=1)break;
}
return 0;
}
Ответы (1 шт):
Автор решения: Harry
→ Ссылка
А забавная задачка... Ну, вводить массу цифр - не мое, так что у меня эта матрица просто генерируется случайно, там уж сами меняйте.
#include <vector>
#include <iostream>
#include <iomanip>
#include <map>
#include <cmath>
#include <assert.h>
using namespace std;
vector<vector<int>> make(int m, map<int,int> els)
{
vector<vector<int>> s(m,vector<int>(m,0));
vector<vector<int>> f = s;
// Расставляем дубли
int col = 0;
for(auto& x: els)
{
if (x.second > 1)
{
for(int j = 0; j < x.second; ++j)
{
s[(col+j)%m][j] = x.first;
f[(col+j)%m][j] = 1;
}
col++;
x.second = 0;
}
}
// Расставляем остальные
auto it = els.begin();
if (it != els.end())
for(int i = 0; i < m; ++i)
for(int j = 0; j < m; ++j)
if (f[i][j] == 0)
{
while (it->second == 0) it++;
s[i][j] = it->first;
it++;
}
return s;
}
int main(int argc, const char * argv[])
{
srand(time(0));
int n = 25;
int m = sqrt(n)+0.5;
if (m*m != n) { cout << n << " - не квадрат!\n"; return 0; }
map<int,int> els;
for(int k, i = 0; i < n; ++i)
{
k = rand()%40;
els[k]++;
cout << k << " ";
}
cout << endl << endl;
int dbls = 0, max_dbl = 0;
for(auto x: els)
{
if (x.second > 1) dbls++;
if (x.second > max_dbl) max_dbl = x.second;
}
if (dbls > m || max_dbl > m) { cout << "Решения нет!\n"; return 0; }
auto v = make(m,els);
for(auto r: v)
{
for(auto c: r) cout << setw(2) << c << " ";
cout << endl;
}
}