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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值