C++题解(36) 2025年顺德区中小学生程序设计展示活动(初中组C++)换位(二)
题目背景
【题干与《换位(一)》基本一致,仅增加了“位对换”指令,对应输入格式、样例、数据范围也有所不同】
【2025.5.12 数据已加强】
题目描述
小明班上是n行m列的座位排列,座位按照行列顺序编号,如6行7列,那么第1行第1列座位号为1号、第1行第7列为7号、第3行第4列为18号,如此递推。
现在期中考刚结束要进行全班换座位。班主任刚刚公布了换位指令,指令一共z条且只有以下几类:
①行对换;
②列对换;
③位对换。
请你根据换位指令找到换位结束后第x行第y列的原座位号。
输入格式
第1行为三个整数,分别为n、m、z,以空格隔开,整数含义如题所示。
第2至z+1行有三个或者五个整数,分别为a、b、c或a、b、c、e、f。若a为1,则将bc行对换;若a为2,则将bc列对换;若a为3,则将b行c列与e行f列的位置对换。
最后1行有两个整数,分别为x和y,整数含义如题所示。
输出格式
输出1行,输出第x行第y列的原座位号。
输入输出样例
输入 #1
5 5 3 1 1 2 2 3 1 3 1 1 1 2 1 2
输出 #1
8
说明/提示
样例解析
5行5列的座位,先将12行互换,再将31列互换,最后把(1,1)和(1,2)互换,得出最终(1,2)的原座位号为8。
数据范围
对于100%的数据:4999≤n,m≤5000,z=100000。
参考答案
#include <iostream>
using namespace std;
int main()
{int n,m,z,x,y;int p[5001],q[5001],a,b,c,e,f;cin>>n>>m>>z;for(int i=1;i<=n;i++) p[i]=i;for(int i=1;i<=m;i++) q[i]=i;int xy[n+1][m+1];int l=0;for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){xy[i][j]=(i-1)*m+j; }}for(int i=1;i<=z;i++){cin>>a;if(a==1||a==2){cin>>b>>c;if(a==1)swap(p[b],p[c]);else swap(q[b],q[c]);}else{cin>>b>>c>>e>>f;int i1=p[b],j1=q[c];int i2=p[e],j2=q[f];swap(xy[i1][j1],xy[i2][j2]);}}cin>>x>>y;int row=p[x];int col=q[y];cout<<xy[row][col];return 0;
}