题意:
两个正方体,上下左右前后六面分别标记为1-6(任意顺序);
现在有四种旋转方式,就是沿底面那四条边转一下;
给出两个正方体,问第一个可以经过几次旋转变成和第二个完全一样(朝向和数字)
思路:
暴力bfs,如果可以转到,最到转四次,超过四次就说明不行了;
#include<cstdio>
#include<cstring>
#include<queue>
#include<map>
using namespace std;
int dice[4][6] = {{3,2,0,1,4,5},{2,3,1,0,4,5},{5,4,2,3,0,1},{4,5,2,3,1,0}};
struct dic{
int dir[6];
int t;
bool operator==(dic a)const {
for(int i = 0; i < 6; i++) {
if(this->dir[i] != a.dir[i])
return false;
}
return true;
}
}d[4];
bool ok;
queue<dic>q;
int bfs(){
q.push(d[0]);
while(!q.empty()) {
d[2] = q.front();
if(d[2].t > 4)
return -1;
q.pop();
if(d[2] == d[1])
return d[2].t;
for(int i= 0; i < 4; i++) {
for(int j = 0; j < 6; j++) {
d[3].dir[j] = d[2].dir[dice[i][j]];
}
d[3].t = d[2].t + 1;
q.push(d[3]);
}
}
}
int main() {
while(scanf("%d",&d[0].dir[0]) == 1) {
while(!q.empty())
q.pop();
ok = false;
for(int i = 1; i <= 5; i++) {
scanf("%d",&d[0].dir[i]);
}
for(int i = 0; i < 6; i++) {
scanf("%d",&d[1].dir[i]);
}
d[0].t = 0;
printf("%d\n",bfs());
}
}