题解 CF645A Amity Assessment
\[\text{题目大意}
\]
\(\quad\)有一个 2$\times$2 的网格,每个格子中是字母 \(A,B,C,X\) 中的一个;
\(\quad\)你可以进行若干次操作:每次操作中,你选择含字母 \(X\) 的格子和一个与之相邻的格子交换;
\(\quad\)给定网格的初始状态和最终状态,问是否可以通过有限次操作从初始状态到达最终状态?
\[\text{思路}
\]
\(\quad\)根据多年划水经验,只需要判断三个字母 \(A,B,C\) 之间的位置关系即可,因为可以和含 \(X\) 的格子交换,所以忽略这个格子,考虑顺时针顺序即可。
\(\quad\)可以玩玩Windows上的小游戏,这个叫图片拼图板,找找规律(一本正经)。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#define re register int
#define il inline
using namespace std;
il void print(int x)
{
if(x<0)putchar('-'),x=-x;
if(x/10)print(x/10);
putchar(x%10+'0');
}
il int min(int x,int y){return x<y?x:y;}
int t1,t2;
char a[4],b[4];
signed main()
{
for(re i=1;i<=4;i++)
{
cin>>a[i-1];
if(a[i-1]=='A')t1=i;//找出A的位置
}
for(re i=1;i<=4;i++)
{
cin>>b[i-1];
if(b[i-1]=='A')t2=i;
}
int x,y;//判断顺时针方向A的下一个字母
if(t1==1)x=a[1]!='X'?a[1]:a[3];
else if(t1==2)x=a[3]!='X'?a[3]:a[2];
else if(t1==3)x=a[0]!='X'?a[0]:a[1];
else x=a[2]!='X'?a[2]:a[0];
if(t2==1)y=b[1]!='X'?b[1]:b[3];
else if(t2==2)y=b[3]!='X'?b[3]:b[2];
else if(t2==3)y=b[0]!='X'?b[0]:b[1];
else y=b[2]!='X'?b[2]:b[0];
if(x==y)puts("YES");else puts("NO");
return 0;
}
\[\text{后话}
\]
\(\quad\)本题的双倍经验:P7724 远古档案馆(Ancient Archive)
\(\quad\)我的记录