#include <iostream>
#include <vector>
#include <stdio.h>
#include <set>
using namespace std;
const int N=0;
const int E=1;
const int S=2;
const int W=3;
const int Z=4;
int rs[5][4]={{0,1,5,4},{0,3,5,2},{0,4,5,1},{0,2,5,3},{3,1,2,4}};
struct xai{
int ds[6];
void round(int n){
int t=ds[rs[n][0]];
for(int i=0;i<3;i++){
ds[rs[n][i]]=ds[rs[n][i+1]];
}
ds[rs[n][3]]=t;
}
xai rounds(int n){
xai e;
for(int i=0;i<6;i++)e.ds[i]=ds[i];
if(0<n){
e.round(S);
}
if(1<n){
e.round(E);
}
if(2<n){
e.round(E);
}
if(3<n){
e.round(E);
}
if(4<n){
e.round(S);
}
return e;
}
void roundZ(){
int cs[4];
std::vector<int> vec;
for(int i=0;i<4;i++){
vec.push_back(ds[rs[Z][i]]);
}
for(int i=0;i<4;i++){
round(Z);
std::vector<int> vec2;
for(int i=0;i<4;i++){
vec2.push_back(ds[rs[Z][i]]);
}
if(vec<vec2)vec=vec2;
}
for(int i=0;i<4;i++){
ds[rs[Z][i]]=vec[i];
}
}
bool eq(xai e){
for(int i=0;i<6;i++){
if(ds[i]!=e.ds[i])return false;
}
return true;
}
bool operator<(const xai& e)const{
for(int i=0;i<6;i++){
if(ds[i]!=e.ds[i])return ds[i]<e.ds[i];
}
return false;
}
};
int main() {
xai es[101],e2;
int n;
scanf("%d",&n);
for(int i=0;i<n;i++){
for(int j=0;j<6;j++){
scanf("%d",&es[i].ds[j]);
}
}
bool hit=false;
std::set<xai> sets;
for(int i=0;i<n;i++){
int min=es[i].ds[0];
int top=0;
for(int j=0;j<6;j++){
e2=es[i].rounds(j);
if(min>e2.ds[0]){
min=e2.ds[0];
top=j;
}
}
e2=es[i].rounds(top);
e2.roundZ();
sets.insert(e2);
}
printf("%s\n",sets.size()==n?"Yes":"No");
return 0;
}
最終更新:2016年03月24日 02:07