xtuoj 0x05-C 项链
题目
思路
主要是实现旋转和翻转操作,注意这是一个环
实现旋转操作,且是环,我们可以创建一个二倍数组,就是把数组复制一遍存到数组后面,然后我们依次取n个,就是从第 i 个起取 n 个为一个序列,然后我们依次判断 a[i+j] 与 b[j] 是否相等就好了,a[i+j] 就是第 i 个开始的这个序列的第 j 个,b[j] 就是b序列的第 j 个
实现翻转操作,题目说是沿对称轴旋转180°,其实就是取逆序序列就好了,具体取法就是 a[i]=a[n-1-i] 就好了,当然我们还是要创建一个二倍数组,这样我们可以判断旋转翻转以后是否匹配
代码
#include<stdio.h>
#define N 1005int n;
int a[N],b[N];
int a2[N*2];
int reva[N],reva2[N*2];int main(){int T;scanf("%d",&T);while(T--){scanf("%d",&n);for(int i=0;i<n;i++) scanf("%d",&a[i]);for(int i=0;i<n;i++) scanf("%d",&b[i]);for(int i=0;i<2*n;i++) a2[i]=a[i%n];for(int i=0;i<n;i++) reva[i]=a[n-1-i];for(int i=0;i<2*n;i++) reva2[i]=reva[i%n];int found=0;for(int i=0;i<n;i++){int match=1;for(int j=0;j<n;j++){if(a2[i+j]!=b[j]){match=0;break;}}if(match){found=1;break;}}if(!found){for(int i=0;i<n;i++){int match=1;for(int j=0;j<n;j++){if(reva2[i+j]!=b[j]){match=0;break;}}if(match){found=1;break;}}}if(found) printf("Yes\n");else printf("No\n");}return 0;
}