题意:给一个二维模版,有3种方式的变化形态,问变化到一个形态的最短路径是什么
直接就用队列找最短即可。
注意保存状态是用map来进行的保存
/*
ID:
PROG: msquare
LANG: C++
*/
#include<iostream>
#include <stdio.h>
#include <string.h>
#include<stdlib.h>
#include <map>
#include <set>
#include <math.h>
#include <queue>
#include <algorithm>
#include<vector>
using namespace std;
struct ttt{
int num,p;
};
map<int,ttt>pre;
int q1[10];
int q2[10];
int q3[5];
int qq[50500];
int main(){
freopen("msquare.in","r",stdin);
freopen("msquare.out","w",stdout);
int i,j,k,l1,f1,f2,f3,f4,t4,t1,t2,m;
int T,t;
int t3,n;
t1=0;
for(i=1;i<=4;i++){
cin >> t2;
t1=t1*10+t2;
}
for(i=1;i<=4;i++){
cin >> q3[i];
}
for(i=4;i>=1;i--){
t1=t1*10+q3[i];
}
queue<int>G;
pre[12348765].p=-1;
G.push(12348765);
int u,v,u1;
while(!G.empty()){
u=G.front();G.pop();
if(u==t1)break;
u1=u;
for(i=8;i>=1;i--){
q1[i]=q2[i]=u%10;
u/=10;}
v=0;
for(i=5;i<=8;i++)
v=v*10+q1[i];
for(i=1;i<=4;i++)
v=v*10+q1[i];
if(pre[v].p==0){
pre[v].p=u1;
pre[v].num=1;
G.push(v);
}
v=0;
q2[1]=q1[4];
for(i=2;i<=4;i++)
q2[i]=q1[i-1];
q2[5]=q1[8];
for(i=6;i<=8;i++)
q2[i]=q1[i-1];
v=0;
for(i=1;i<=8;i++){
v=v*10+q2[i];
}
if(pre[v].p==0){
pre[v].p=u1;
pre[v].num=2;
G.push(v);
}
f1=q1[3];
q1[3]=q1[2];
q1[2]=q1[6];
q1[6]=q1[7];
q1[7]=f1;
v=0;
for(i=1;i<=8;i++)
v=v*10+q1[i];
if(pre[v].p==0){
pre[v].p=u1;
pre[v].num=3;
G.push(v);
}
}
ttt uuu;
uuu.p=u;
t1=0;
while(1){
if(pre[uuu.p].p==-1)break;
uuu=pre[uuu.p];
qq[++t1]=uuu.num;
}
cout << t1<< endl;
for(i=t1;i>=1;i--){
if(qq[i]==1)
cout <<"A";
else if(qq[i]==2)
cout <<"B";
else
cout << "C";
}
cout << endl;
return 0;
}