题解 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\)我的记录

posted @ 2021-10-25 21:03  Farkas_W  阅读(36)  评论(0编辑  收藏  举报