Вот какое-то решение из ФИДО (извините ребята, я сейчас анализировать/проверять не могу. И вообще ничего не могу). ======= Alex Kocharin wrote: > Комбинация транспонирования и отражения. > > Транспонирование: > (x,y) -> (y,x) > x*N+y -> y*M+x > > Отражение: > (x,y) -> (x,M-y-1) > x*M+y -> x*M+M-y-1 > > Т.е. > x*N+y -> y*M+M-x-1 > > Отбратно: транспонирование: > (x,y) -> (y,x) > x*N+y -> y*M+x > > Отражение: > (x,y) -> (N-x-1,y) > x*N+y -> (M-x-1)*N+y > > Т.е. > x*N+y -> (M-y-1)*N+x > > Программа (не оптимизированная): > > for(int i=0; i<M*N; i++) { > int x1 = i/N, y1 = i-x1*N; > int prev = (M-y1-1)*N+x1; > if (prev < i) { > int ires = y1*M+M-x1-1; > int t = picture[ires]; > picture[ires] = picture[i]; > picture[i] = t; > } > } > > Сдаём заказчику: > > int i;i^=i;for(;i<M*N;){int x1=i/N,y1=i-x1*N,p=M*N-y1*N-N+x1;if(p<i){int > r=y1*M+M-x1-1,t=p[r];p[r]=p[i];p[i++]=t;}} > > Проверяй. ;-))) > > Возможно, я где-то ошибся - там N вместо M или единичка где лишняя... По > крайней мере, идея imho верная. > > =======
|