CCF-CSP第34次认证第二题——矩阵重塑其二【需反复思考学习】 - 技术栈D34这道题主要分类讨论的思想顺便复习了一下一的思想代码//矩阵重塑 int n,m,t; cinnmt; vectorvectorint ans(n, vectorint(m)); //n*m; for(int i0;in;i){ for(int j0;jm;j){ cinans[i][j]; } } while(t--){ int op,a,b; cinopab; if(op2){//转置 //int tmp; vectorvectorintret(m,vectorint(n));//格式 for(int i0;in;i){ for(int j0;jm;j){ ret[j][i]ans[i][j]; //tmpans[i][j]; //ans[i][j]ans[j][i]; //ans[j][i]tmp; } } ansret; swap(n, m); } if(op3){ coutans[a][b]endl; } if(op1){ vectorvectorint ret(a,vectorint(b));//格式 for(int i0;ia;i){ for(int j0;jb;j){ int Ki*bj; int ori_iK/m; int ori_jK%m; //Ki*mj1;KI*MJ; ret[i][j]ans[ori_i][ori_j]; } } // 修正3更新原矩阵和维度后续操作基于新矩阵 ans ret; n a; m b; } }运行结果复盘1.自己成功推导出来了一的那个公式有进步2.新学会了矩阵交换的写法我还以为要手写两行for呢ans ret; n a; m b;3.在矩阵置换那里犯了一个愚蠢的错误if(op2){//转置 int tmp; for(int i0;in;i){ for(int j0;jm;j){ tmpans[i][j]; ans[i][j]ans[j][i]; ans[j][i]tmp; } } swap(n, m); }一开始想用中间变量直接转置还在洋洋得意发现纯是大傻春了。两边转置又都转回去了后面想着那就转上三角吧结果发现又没说是方阵没招了。附上三角矩阵转置直接原地转就可以if (op 2) { // 方阵原地转置核心逻辑 int tmp; // 仅用1个临时变量 // 遍历上三角区域i j避免重复交换 for (int i 0; i n; i) { for (int j i 1; j n; j) { // 三步交换仅用临时变量tmp tmp ans[i][j]; ans[i][j] ans[j][i]; ans[j][i] tmp; } } cout 方阵原地转置完成 endl; // 方阵转置后nm不变无需swap(n,m) }以上完毕