Кому не трудно, нужна идея как сделать проще

Zazy

Всем добра! собственно вот задание Дана целочисленная матрица A(M,N). Продублировать в матрице каждый столбец, являющийся перестановкой натуральных чисел от 1 до М. т.е. что нужно сделать допустим исходный массив 1, 2, 3, 4, 5 2, 1, 8, 9, 0 если столбе равен перестановкой натуральных чисел от 1 до М, дописать этот столбец в конце результат 1, 2, 3, 4, 5, 1, 2 2, 1, 8, 9, 0, 2, 1 мой алгоритм мне кажется муторным, может кто каких идей подбросит: А[2][5] = {{1, 2, 3, 4, 5}, {2, 1, 8, 9, 0}}; Создать два массива размерностью T1[M], T2[M], первый заполнить от 1 до М T1[M] = {1, 2}, во второй массив помещать столбцы массива А1 делать сортировку и сравнивать с T1, если массивы равны счетчик увеличить на 1 (это для создания динамического массива куда будет занесен результат), создаю двумерный динамический массив, еще раз запускаю цикл на сравнения, те что проходят по условию записываю в конец массива (i =1, N + i, это момент еще не до конца продуман) а потом просто заполняю динамический массив элементами A[M][N] фух надеюсь понятно изложил. ЗЫ. только идеи, прошу код не писать
1 ответ

Zazy

Кодом, пожалуй, нагляднее будет
const unsigned M = 10;
bool Is1toM(unsigned* arr)
{
bool Found[M] = { false };
for (unsigned i = 0; i < M; ++i)
 {
 unsigned val = arr[i] - 1;
 if (val < 0 || val >= M)   //Вообще-то unsigned не может быть меньше нуля, это для иллюстрации и на случай замены на signed
  return false;
 if (Found[val])
  return false;
 Found[val] = true;
 }
return true;
}
То есть для всех чисел от 1 до М у нас есть флаги в массиве, что данное число уже обнаружено при просмотре входного массива. Если элемент входного массива не есть число от 1 до М - фейл, если обнаруживаем второе вхождение - аналогично.