搅拌机:直接维护矩阵¶
出题人解法:交换对应行列,旋转时按坐标映射复制到临时矩阵。Codex(GPT-6):标准 C++17 整理、边界验证,以及行列索引表示的补充方案。
操作与正确性¶
先检查交换参数是否属于当前行数或列数范围。任一参数越界时,只打印错误行,不改矩阵。
行交换把两行对调;列交换逐行交换对应两项。使用零起始坐标时,顺时针旋转满足
\[
\mathrm{new}[j][n-1-i]=\mathrm{old}[i][j]
\]
新矩阵有 \(m\) 行、\(n\) 列。使用独立临时矩阵,全部映射完再替换当前矩阵并交换行列数,避免覆盖尚未读取的格子。
行列交换显然只改变题目指定的对应位置。旋转公式把左上角送到新矩阵右上角,把从上到下的方向变成从右到左;所有 \(nm\) 个格子一一映射,正好是顺时针旋转。无效操作保持状态不变,因此对操作数归纳,每次输出都是正确的当前状态。
复杂度¶
令 \(C=nm\) 为不随旋转改变的格子数,\(V\) 为合法操作数。合法操作后的输出就需要 \(\Theta(C)\) 次数值输出。加上初始化和无效操作,总时间为 \(O(C+K+VC)\) ,空间为 \(O(C)\) ;旋转临时矩阵另外使用 \(O(C)\) 空间。程序用整行容器交换实现行交换,列交换逐行执行。
补充方案与使用¶
std.cpp直接表达操作规则,作为首选。行列索引方案与 alternative.cpp保留初始矩阵,只修改行列排列和转置标记,不移动物品值;它与直接方案并列,均通过完整数据。补充方案降低维护操作本身的工作量,但仍要逐次打印全部状态,因此不能宣称总复杂度低于输出规模。
数据涵盖长条网格、四次连续旋转、最大矩阵、负数和零参数、旋转后维数变化及无效操作后的状态。见 plan.json与评测说明。