关于旋转和翻转的问题,建议各位在纸上自己画一下,找到规律一下就懂了
比如我画的
#include<iostream>
#include<unordered_set>
#include<cstring>
#include<queue>
using namespace std;
const int N=11;
unordered_set<string> set;
char g1[N][N],g2[N][N];
int n;
string start,ed;
string turn(int type,char g[N][N]) //处理旋转和翻转操作
{
char t[N][N];
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
if(type==1) t[j][n-1-i]=g[i][j]; //顺时针旋转90
else if(type==2) t[n-1-j][n-1-i]=g[i][j]; //顺时针旋转180
else if(type==3) t[n-1-j][i]=g[i][j]; //顺时针旋转270
else if(type==4) t[n-1-i][j]=g[i][j]; //水平翻转
else t[i][n-j-1]=g[i][j]; //垂直翻转
}
string str=""; //将char[][]转为string后返回
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
str+=t[i][j];
return str;
}
bool bfs() //暴力搜索
{
queue<string> q;
q.push(start);
set.insert(start);
char g[N][N];
while(!q.empty())
{
string fr=q.front();
q.pop();
if(fr==ed) return true;
//将string转为char[][],方便旋转操作
int idx=0;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
g[i][j]=fr[idx++];
for(int type=1;type<=5;type++)
{
string t=turn(type,g);
if(!set.count(t))
{
q.push(t);
set.insert(t);
}
}
}
return false;
}
int main()
{
cin>>n;
for(int i=0;i<n;i++) scanf("%s",g1[i]);
for(int i=0;i<n;i++) scanf("%s",g2[i]);
//设置起点终点
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
start+=g1[i][j],ed+=g2[i][j];
if(bfs()) puts("Yes");
else puts("No");
return 0;
}
清晰