ITP1_11_D: Dice IV

http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ITP1_11_D
与えられたダイスが全て違うものならYesをでないならNoを返す問題。

#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