Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Исправить задаачу на C++

tian kami Ученик (243), на голосовании 10 месяцев назад
данный код сортирует матрицу вот так как показано на рисунке https://pastebin.com/gfPTLs7L - код

а должна сортировать вот так

помогите исправить пожалуйста
Голосование за лучший ответ
Evgeny Мастер (1448) 11 месяцев назад
Не стал изменять но переделал. Так будет выполнять ваши условия.
 #include  
#include
#include
#include
#include


// алгоритм движение змейкой вверх вниз начиная в верхнего левого угла.
// принимает как параметры номер строки и столбца возвращает порядковый номер элемента начиная с 0.
int slice_top(int i,int j, int sqn){
int split = sqn>>1; //sqn/2
if(j%2==0)
return j*split+i;
else
return j*split+split-i-1;
}
// алгоритм движения лево право начиная с нижнего левого угла.
// принимает как параметры номер строки и столбца возвращает порядковый номер элемента начиная с 0
// особенность зависит от четности длинны строки матрицы
int slice_bottom(int i,int j,int sqn){

int split = (sqn>>1)+(sqn&1); //sqn/2
// int split = std::ceil(static_cast(sqn)/2);

if((split-i)%2)
return (split-i-1)*sqn+j;
else
return (split-i-1)*sqn+sqn-j-1;
}

//функция возвращает порядковый номер элемента в зависимости от алгоритма движения.
int slice(int i,int j,int sqn){
int split = sqn>>1;

if(i return slice_top(i,j,sqn);
else
return slice_bottom(i-split,j,sqn);
}

//Преобразует положение элемента из последовательного в смешанный с использованием алгоритмов .
int get_position(int pos,const int sqn){

int i = pos/sqn;
int j= pos%sqn;

int new_pos = slice(i,j,sqn) + ((i>=(sqn/2))?sqn*(sqn/2):0);
return new_pos;
}

void print_matrix(const std::vector& v,int sqn){
size_t pos =0;
for(auto e:v){
std::cout << std::setw(5) << e;
if((++pos)%sqn==0)
std::cout << std::endl;
}
std::cout << std::endl;
return;
}

int main(){
srand(time(NULL));

int num = 3;
int sqn = num*num;
int split = sqn*(sqn>>1);

std::vector a(sqn*sqn); // 1я матрица sqn x sqn ;
std::generate(a.begin(),a.end(),[](){return rand() % 100; }); //заполняем случайными числами;

// создраем копию и сортируем в порядке возрастания индексов
std::vector b(a); // 2я матрица sqn x sqn ;
std::sort(b.begin(),std::next(b.begin(),split)); //cортируем первую половину матрицы
std::sort(std::next(b.begin(),split),b.end()); //cортируем вторую половину матрицы

std::vector c(sqn*sqn); // 3я матрица sqn x sqn ;

for(int i=0;i c[i] = b[get_position(i,sqn)]; //устанавливаем порядок отсортированных элементов

print_matrix(a,sqn);
print_matrix(c,sqn);

return 0;
}
Похожие вопросы