#include <bits/stdc++.h>
using namespace std;
void cardGenerator(int rows, int cols)
{
vector<int> colPool [cols];
for(int j=0;j<cols;j++)
{
int start = j*10 +1;
int end = (j+1)*10;
for(int k=start;k<=end;k++)
{
colPool[j].push_back(k);
}
shuffle(colPool[j].begin(),colPool[j].end(),mt19937(random_device{}()));
}
vector<vector<int>> card(rows,vector<int>(cols,0));
vector <int> rowCount (rows,0);
for(int j=0;j<cols;j++)
{
int row = j%rows;
card[row][j] = colPool[j].back();
colPool[j].pop_back();
rowCount[row]++;
}
//pick random col
vector<int> randomColNo (cols,0);
for(int i=0;i<cols;i++)
{
randomColNo[i]=i;
}
shuffle(randomColNo.begin(),randomColNo.end(),mt19937(random_device{}()));
for(int i=0;i<rows;i++)
{
for(int j =0;j<cols;j++)
{
if(card[i][randomColNo[j]]==0)
{
card[i][randomColNo[j]] = colPool[randomColNo[j]].back();
colPool[randomColNo[j]].pop_back();
rowCount[i]++;
if(rowCount[i]==5)
{
break;
}
}
}
}
for(int j=0;j<cols;j++)
{
vector <int> temp;
for(int i=0;i<rows;i++)
{
if(card[i][j]!=0)
{
temp.push_back(card[i][j]);
}
}
sort(temp.begin(),temp.end());
int k=0;
for(int i=0;i<rows;i++)
{
if(card[i][j]!=0)
{
card[i][j] = temp[k];
k++;
}
}
}
for(int i=0;i<rows;i++)
{
cout<<"\n";
for(int j=0;j<cols;j++)
{
cout<<card[i][j]<<" ";
}
}
}
int main() {
// your code goes here
cardGenerator (3,9);
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgoKdm9pZCBjYXJkR2VuZXJhdG9yKGludCByb3dzLCBpbnQgY29scykKewoJdmVjdG9yPGludD4gY29sUG9vbCBbY29sc107CgkKCQoJCWZvcihpbnQgaj0wO2o8Y29scztqKyspCgkJewoJCQlpbnQgIHN0YXJ0ID0gaioxMCArMTsKCQkJaW50IGVuZCA9IChqKzEpKjEwOwoJCQlmb3IoaW50IGs9c3RhcnQ7azw9ZW5kO2srKykKCQkJewoJCQkJY29sUG9vbFtqXS5wdXNoX2JhY2soayk7CgkJCX0KCQkJc2h1ZmZsZShjb2xQb29sW2pdLmJlZ2luKCksY29sUG9vbFtqXS5lbmQoKSxtdDE5OTM3KHJhbmRvbV9kZXZpY2V7fSgpKSk7CgkJCQoJCX0KCQkKCQl2ZWN0b3I8dmVjdG9yPGludD4+IGNhcmQocm93cyx2ZWN0b3I8aW50Pihjb2xzLDApKTsKCQl2ZWN0b3IgPGludD4gcm93Q291bnQgKHJvd3MsMCk7CgkJZm9yKGludCBqPTA7ajxjb2xzO2orKykKCQl7CgkJCWludCByb3cgPSBqJXJvd3M7CgkJCWNhcmRbcm93XVtqXSA9IGNvbFBvb2xbal0uYmFjaygpOwoJCQljb2xQb29sW2pdLnBvcF9iYWNrKCk7CgkJCXJvd0NvdW50W3Jvd10rKzsKCQl9CgkJLy9waWNrIHJhbmRvbSBjb2wKCQl2ZWN0b3I8aW50PiByYW5kb21Db2xObyAoY29scywwKTsKCQlmb3IoaW50IGk9MDtpPGNvbHM7aSsrKQoJCXsKCQlyYW5kb21Db2xOb1tpXT1pOwkKCQl9CgkJc2h1ZmZsZShyYW5kb21Db2xOby5iZWdpbigpLHJhbmRvbUNvbE5vLmVuZCgpLG10MTk5MzcocmFuZG9tX2RldmljZXt9KCkpKTsKCQlmb3IoaW50IGk9MDtpPHJvd3M7aSsrKQoJCXsKCQkJCWZvcihpbnQgaiA9MDtqPGNvbHM7aisrKQoJCQkJewoJCQkJCWlmKGNhcmRbaV1bcmFuZG9tQ29sTm9bal1dPT0wKQoJCQkJCXsKCQkJCQljYXJkW2ldW3JhbmRvbUNvbE5vW2pdXSA9IGNvbFBvb2xbcmFuZG9tQ29sTm9bal1dLmJhY2soKTsKCQkJCQljb2xQb29sW3JhbmRvbUNvbE5vW2pdXS5wb3BfYmFjaygpOwoJCQkJCXJvd0NvdW50W2ldKys7CgkJCQkJaWYocm93Q291bnRbaV09PTUpCgkJCQkJewoJCQkJCQlicmVhazsKCQkJCQl9CgkJCQkJfQoJCQkJCQoJCQkJfQoJCX0KCQlmb3IoaW50IGo9MDtqPGNvbHM7aisrKQoJCXsKCQkJdmVjdG9yIDxpbnQ+IHRlbXA7CgkJCWZvcihpbnQgaT0wO2k8cm93cztpKyspCgkJCXsKCQkJCWlmKGNhcmRbaV1bal0hPTApCgkJCQl7CgkJCQkJdGVtcC5wdXNoX2JhY2soY2FyZFtpXVtqXSk7CgkJCQl9CgkJCX0KCQkJc29ydCh0ZW1wLmJlZ2luKCksdGVtcC5lbmQoKSk7CgkJCWludCBrPTA7CgkJCWZvcihpbnQgaT0wO2k8cm93cztpKyspCgkJCXsKCQkJCWlmKGNhcmRbaV1bal0hPTApCgkJCQl7CgkJCQkJY2FyZFtpXVtqXSA9IHRlbXBba107CgkJCQkJaysrOwoJCQkJfQoJCQl9CgkJCQoJCX0KCQlmb3IoaW50IGk9MDtpPHJvd3M7aSsrKQoJCXsKCQkJY291dDw8IlxuIjsKCQkJZm9yKGludCBqPTA7ajxjb2xzO2orKykKCQkJewoJCQkJY291dDw8Y2FyZFtpXVtqXTw8IiAiOwoJCQl9CgkJfQoJCQoJCQp9CgppbnQgbWFpbigpIHsKCS8vIHlvdXIgY29kZSBnb2VzIGhlcmUKCWNhcmRHZW5lcmF0b3IgKDMsOSk7Cn0=