1.题目描述:点击打开链接
2.解题思路:本题利用BFS解决。本题是一道隐式图搜索题目,不过本题的状态扩展比较简单,直接用常量数组即可搞定,然后就可以进行扩展了,比较简单就不再详细叙述过程了。
3.代码:
#include<iostream>
#include<algorithm>
#include<cassert>
#include<string>
#include<sstream>
#include<set>
#include<bitset>
#include<vector>
#include<stack>
#include<map>
#include<queue>
#include<deque>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<ctime>
#include<cctype>
#include<complex>
#include<functional>
#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std;
#define me(s) memset(s,0,sizeof(s))
#define rep(i,n) for(int i=0;i<(n);i++)
typedef long long ll;
typedef unsigned int uint;
typedef unsigned long long ull;
typedef pair <int, int> P;
typedef int State[6];
const int N=6000000;
const int Hashsize=10007;
State st[N];
State goal;
int dist[N];
int head[Hashsize],Next[N];
int op[][6]={{3,2,0,1,4,5},{4,5,2,3,1,0},{2,3,1,0,4,5},{5,4,2,3,0,1}};
int Hash(State&s)
{
int v=0;
for(int i=0;i<6;i++)
v=v*6+s[i];
return v%Hashsize;
}
void init_lookup_table()
{
memset(head,0,sizeof(head));
}
int try_to_insert(int s)
{
int h=Hash(st[s]);
int u=head[h];
while(u)
{
if(memcmp(st[u],st[s],sizeof(st[s]))==0)return 0;
u=Next[u];
}
Next[s]=head[h];
head[h]=s;
return 1;
}
int bfs()
{
init_lookup_table();
int front=1,rear=2;
while(front<rear)
{
State&s=st[front];
if(memcmp(goal,s,sizeof(s))==0)return front;
for(int i=0;i<4;i++)
{
State&t=st[rear];
for(int j=0;j<6;j++)
t[j]=s[op[i][j]];
dist[rear]=dist[front]+1;
if(try_to_insert(rear))rear++;
}
front++;
}
return 0;
}
bool judge()
{
for(int i=0;i<6;i++)
if(st[1][i]!=goal[i])return false;
return true;
}
int main()
{
while(~scanf("%d",&st[1][0]))
{
for(int i=1;i<6;i++)
scanf("%d",&st[1][i]);
for(int i=0;i<6;i++)
scanf("%d",&goal[i]);
for(int i=0;i<6;i++)
st[1][i]--,goal[i]--;
int ans;
if(judge()){printf("0\n");continue;}
else ans=bfs();
if(ans)printf("%d\n",dist[ans]);
else puts("-1");
}
}