魔法方阵(CSP-J模拟赛)
【问题描述】
一个魔法方阵由3×33×3的方格组成,其中每个格子里面有一个1−91−9的数字,并且每个1−91−9的数字在格子中都出现了恰好一次。在这个3×33×3的方格中有四个小的2×22×2的方格,分别位于整个3×33×3的方格的左上,右上,左下和右下,并按照顺序标号为1,2,3,41,2,3,4。这些2×22×2的方格可以被旋转,我们使用2×22×2的方格的编号以及一个大写字母CC或者RR来表示这次旋转。如果旋转的方向是顺时针,我们用CC来表示,否则我们用RR来表示。
现在,给定魔法方阵的初始状态以及一系列操作,你需要输出魔法方阵的最终状态。
【输入格式】
第一行输入一个正整数nn,表示操作的数量。 接下来33行,每行一个长度为33的只包含数字的字符串,表示魔法方阵的初始状态。其中第i(1≤i≤3)i(1≤i≤3)行的第j(1≤j≤3)j(1≤j≤3)个数字表示在魔法方阵初始时位于第ii行第jj列的数字。
接下来nn行,每行包含一个长度为22的由一个1−41−4的数字和一个大写字母CC或RR的字符串,表示一次操作。
【输出格式】
输出33行,每行包含一个长度为33的只包含数字的字符串,表示魔法方阵的最终状态。
【样例1】
input
1
123
456
789
1C
output
413
526
789
【样例2】
input
2
123
456
789
1C
4R
output
413
569
728
【数据范围】
对于100%的数据,1≤n≤1001≤n≤100.
这道题呢,我们需要手动画,不然光想的话是不会想出来的。
根据题意,我们知道,分为1,2,3,4四个区域,我想,可不可以用一个函数来判断t号区域的数字的下标是什么。
123
456
789
加粗的是一号区域,我们发现,加粗数字的下标是t,t+1,t+3,t+4,我们来验证一下这个规律。
123
456
789
加粗的数二号区域,t=2,2,3,5,6(下标),竟然是这个规律。
嘿嘿嘿,其实错了,这个规律在3号区域和4号区域就无法用了,但是我们知道,只要t=该区域左上角数字的下标,那么这个规律就适用,所以,我们可以将区域3和区域4进行一次特判。
OK,这个函数找到了,1~4号区域的下标,接下来该进行旋转了,如果是顺时针旋转的话,将有一下几个操作(根据样例1):
12
45
样例1操作的是在一号区域顺时针旋转,经过我的笔画,顺时针的旋转有3次操作:
12
45
将4和5交换。
12
54
将2和4交换。
14
52
最后将1和4交换。
41
52
这样就实现了顺时针交换,但是在函数里怎么实现呢。我们之前已经找到了这每个区域4个数字的下标,我们将上面的数字交换看成下标交换也行啊。
知道了顺时针交换,就该运算逆时针交换,因为两者刚好是相反的,所以将顺时针的操作反着来就是逆时针旋转就行了。
魔法方阵:
#include<bits/stdc++.h>
using namespace std;
char a[100];
void Operation(int t,char b){
if(t==3) t=4;
else if(t==4) t=5;
if(b=='C'){
swap(a[t+3],a[t+4]);
swap(a[t+1],a[t+4]);
swap(a[t],a[t+1]);
}
else{
swap(a[t],a[t+1]);
swap(a[t+1],a[t+4]);
swap(a[t+3],a[t+4]);
}
}
int main(){
int n;
cin>>n;
for(int i=1;i<=9;i++)
cin>>a[i];
while(n--){
int t;
char b;
cin>>t>>b;
Operation(t,b);
}
for(int i=1;i<=9;i++){
cout<<a[i];
if(i%3==0)
cout<<endl;
}
}
这里给大家介绍一下STL库里面的函数:swap函数,这个函数的主要作用就是交换两个数字(字符串,编码……都可以)
今天的普及组初赛模拟就讲到这里了,其他的改天再讲!