思路:
写一个函数来进行相应的12种操作(12种有:每一列的上移下移 每一行的左移右移)
然后就是用map来判重,因为此时9位数的可能性太多了,用vis数组判重就容易爆栈
#include<bits/stdc++.h>
using namespace std;
string s,res="123456789";
map<string,bool> mp;
struct Node{
string t;
int step;
};
string oper(string str,int x){
if(x==0){//第一行左移
char temp=str[0];
str[0]=str[1];
str[1]=str[2];
str[2]=temp;
}
if(x==1){//第一行右移
char temp=str[2];
str[2]=str[1];
str[1]=str[0];
str[0]=temp;
}
if(x==2){//第二行左移
char temp=str[3];
str[3]=str[4];
str[4]=str[5];
str[5]=temp;
}
if(x==3){//第二行右移
char temp=str[5];
str[5]=str[4];
str[4]=str[3];
str[3]=temp;
}
if(x==4){//第三行左移
char temp=str[6];
str[6]=str[7];
str[7]=str[8];
str[8]=temp;
}
if(x==5){//第三行右移
char temp=str[8];
str[8]=str[7];
str[7]=str[6];
str[6]=temp;
}
if(x==6){//第一列上移
char temp=str[0];
str[0]=str[3];
str[3]=str[6];
str[6]=temp;
}
if(x==7){//第一列下移
char temp=str[6];
str[6]=str[3];
str[3]=str[0];
str[0]=temp;
}
if(x==8){//第二列上移
char temp=str[1];
str[1]=str[4];
str[4]=str[7];
str[7]=temp;
}
if(x==9){//第二列下移
char temp=str[7];
str[7]=str[4];
str[4]=str[1];
str[1]=temp;
}
if(x==10){//第三列上移
char temp=str[2];
str[2]=str[5];
str[5]=str[8];
str[8]=temp;
}
if(x==11){//第三列下移
char temp=str[8];
str[8]=str[2];
str[2]=str[5];
str[5]=temp;
}
return str;
}
int bfs(){
queue<Node> q;
q.push({s,0});
while(!q.empty()){
Node now=q.front();
if(now.t==res){
return now.step;
}
q.pop();
for(int i=0;i<12;i++){
string t1=oper(now.t,i);
if(!mp[t1]){
mp[t1]=true;
q.push({t1,now.step+1});
}
}
}
return -1;
}
int main(){
for(int i=0;i<3;i++){
string str;
cin>>str;
s+=str;
}
cout<<bfs()<<endl;
return 0;
}