C/C++

Как посчитать количество сдвигов С++

Я написал код, который сдвигает матрицу по горизонтали и вертикали до нужной точки. Но я ни как не могу подобрать формулу, чтобы он сдвинул только нужное количество раз.

В начале имею это int A[R][C], max, t = 1, k = 2, posx, posy, l;
потом нахожу posx и posy и от них нужно дойти до t и k

Пока имею это, там где for b это и есть количество свдигов
 for (int b = 0; b < abs(posx+1 - k); b++) 
{

l = A[posy][C - 1];
for (int i = C - 1; i > 0; i--)
{
A[posy][i] = A[posy][i - 1];
}
A[posy][0] = l;
}
cout
Смотрю на эти условия:
 b < abs(posx + 1 - k)
b < abs(posy + 1 - t)
И они мне категорически не нравятся.

Сдвинуть вверх на pos - t и сдвинуть вниз на abs(pos - t) - это совершенно разные вещи. Если разность отрицательна, ваш код будет делать не то. Здесь нужен не abs, а сложение/вычитание по модулю.

Кроме того, код не сдвигает матрицу, а сдвигает (точнее, вращает или циклически сдвигает) только выбранный столбец и выбранную строку. Причём, результат зависит от порядка вращения: если сначала строку, потом столбец, то один результат, а если наоборот, то другой. Как в кубике Рубика, в общем, только он у вас с одной гранью.

И наконец, эффективность алгоритма оставляет желать лучшего. Фантастическое количество лишних перемещений. Разве нельзя сохранить весь затираемый регион (n = posy + 1 - t (mod R) позиций), затем сразу переместить из R - 1 в R - n - 1 (mod R), из R - 2 в R - n - 2 и т.д., затем записать сохранённые данные в нужные ячейки? Получится R + n перемещений, а не как у вас, R * n + 1. И в первом цикле - аналогично.

И если таки дойдёте до модульных операций, Боже вас упаси считать индексы как-нибудь вроде (i + t - 1) % R. Целочисленное деление - одна из самых дорогих операций, а у вас всего два случая: вышло за границу диапазона или нет. Соответственно, надо однократно прибавить или вычесть R, в зависимости от направления движения. Нужно сделать функции сложения/вычитания по модулю и везде их использовать. Вроде таких:
 int addmod(int a, int b, int m) {
int s = a + b;
return s > m ? s - m : s;
}

int submod(int a, int b, int m) {
int d = a - b;
return d < 0 ? d + m : d;
}
И считать смещения только ими. Предполагается, что a и b передаются уже нормализованными, т.е. 0 <= a < m, 0 <= b < m.
Мурад Султанов
Мурад Султанов
87 571
Лучший ответ
Арман Губайдулин это да, но мне без разницы на матрицу, мне главное определенное число довести до нужной позиции, что насчет условия они неправильные, я вот и хотел узнать здесь, как мне его прописать, чтобы оно было независимое