ITP1_11_C: Dice III

http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ITP1_11_C
2つのサイコロが同じものかどうか判定する問題。
rounds関数が長くなってしまった。

#include <iostream>
#include <vector>
#include <stdio.h>
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;
} 
};

int main() {
// your code goes here
xai e,e2,e3;
for(int i=0;i<6;i++){
	scanf("%d",&e.ds[i]);
}
for(int i=0;i<6;i++){
scanf("%d",&e2.ds[i]);
}
e.roundZ();
bool hit=false;
for(int i=0;i<6;i++){
e3=e2.rounds(i);
e3.roundZ();
if(e3.eq(e)==true){
	hit=true;
	break;
}
}
printf("%s\n",hit?"Yes":"No");
return 0;
}
最終更新:2016年03月24日 01:11