#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;
}
}
I2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8aW9tYW5pcD4KI2luY2x1ZGUgPG1hcD4KI2luY2x1ZGUgPGNtYXRoPgojaW5jbHVkZSA8YXNzZXJ0Lmg+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKdmVjdG9yPHZlY3RvcjxpbnQ+PiBtYWtlKGludCBtLCBtYXA8aW50LGludD4gZWxzKQp7CiAgICB2ZWN0b3I8dmVjdG9yPGludD4+IHMobSx2ZWN0b3I8aW50PihtLDApKTsKICAgIHZlY3Rvcjx2ZWN0b3I8aW50Pj4gZiA9IHM7CiAgICAvLyDQoNCw0YHRgdGC0LDQstC70Y/QtdC8INC00YPQsdC70LgKICAgIGludCBjb2wgPSAwOwogICAgZm9yKGF1dG8mIHg6IGVscykKICAgIHsKICAgICAgICBpZiAoeC5zZWNvbmQgPiAxKQogICAgICAgIHsKICAgICAgICAgICAgZm9yKGludCBqID0gMDsgaiA8IHguc2Vjb25kOyArK2opCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNbKGNvbCtqKSVtXVtqXSA9IHguZmlyc3Q7CiAgICAgICAgICAgICAgICBmWyhjb2wraiklbV1bal0gPSAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbCsrOwogICAgICAgICAgICB4LnNlY29uZCA9IDA7CiAgICAgICAgfQogICAgfQogICAgLy8g0KDQsNGB0YHRgtCw0LLQu9GP0LXQvCDQvtGB0YLQsNC70YzQvdGL0LUKICAgIGF1dG8gaXQgPSBlbHMuYmVnaW4oKTsKICAgIGlmIChpdCAhPSBlbHMuZW5kKCkpCiAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IG07ICsraSkKICAgICAgICAgICAgZm9yKGludCBqID0gMDsgaiA8IG07ICsraikKICAgICAgICAgICAgICAgIGlmIChmW2ldW2pdID09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGl0LT5zZWNvbmQgPT0gMCkgaXQrKzsKICAgICAgICAgICAgICAgICAgICBzW2ldW2pdID0gaXQtPmZpcnN0OwogICAgICAgICAgICAgICAgICAgIGl0Kys7CiAgICAgICAgICAgICAgICB9CiAgICByZXR1cm4gczsKfQoKCmludCBtYWluKGludCBhcmdjLCBjb25zdCBjaGFyICogYXJndltdKQp7CiAgICBzcmFuZCh0aW1lKDApKTsKCiAgICBpbnQgbiA9IDI1OwoKICAgIGludCBtID0gc3FydChuKSswLjU7CiAgICBpZiAobSptICE9IG4pIHsgY291dCA8PCBuICA8PCAiIC0g0L3QtSDQutCy0LDQtNGA0LDRgiFcbiI7IHJldHVybiAwOyB9CgogICAgbWFwPGludCxpbnQ+IGVsczsKICAgIGZvcihpbnQgaywgaSA9IDA7IGkgPCBuOyArK2kpCiAgICB7CiAgICAgICAgayA9IHJhbmQoKSU0MDsKICAgICAgICBlbHNba10rKzsKICAgICAgICBjb3V0IDw8IGsgPDwgIiAiOwogICAgfQogICAgY291dCA8PCBlbmRsIDw8IGVuZGw7CgogICAgaW50IGRibHMgPSAwLCBtYXhfZGJsID0gMDsKICAgIGZvcihhdXRvIHg6IGVscykKICAgIHsKICAgICAgICBpZiAoeC5zZWNvbmQgPiAxKSBkYmxzKys7CiAgICAgICAgaWYgKHguc2Vjb25kID4gbWF4X2RibCkgbWF4X2RibCA9IHguc2Vjb25kOwogICAgfQogICAgaWYgKGRibHMgPiBtIHx8IG1heF9kYmwgPiBtKSB7IGNvdXQgPDwgItCg0LXRiNC10L3QuNGPINC90LXRgiFcbiI7IHJldHVybiAwOyB9CgogICAgYXV0byB2ID0gbWFrZShtLGVscyk7CgogICAgZm9yKGF1dG8gcjogdikKICAgIHsKICAgICAgICBmb3IoYXV0byBjOiByKSBjb3V0IDw8IHNldHcoMikgPDwgYyA8PCAiICI7CiAgICAgICAgY291dCA8PCBlbmRsOwogICAgfQoKfQo=