魔板

#include <bits/stdc++.h>
using namespace std;
struct node{
    string mbzt;
    string dongzuochuan;
};
queue <node> q;
set<string>s;
string start_zt="12345678";
string target_zt;
string A_shangxia(string mbzt){
   string temp;
   temp=mbzt.substr(4,4)+mbzt.substr(0,4);
   return temp;
}
string B_youyi(string mbzt){
   string temp;
   temp=mbzt.substr(3,1)+mbzt.substr(0,3)+mbzt.substr(7,1)+mbzt.substr(4,3);
   return temp; 
}
string C_zhongjianzhuan(string mbzt){
   string temp;
   temp=mbzt.substr(0,1)+mbzt.substr(5,1)+mbzt.substr(1,1)+mbzt.substr(3,1)+mbzt.substr(4,1)+mbzt.substr(6,1)+mbzt.substr(2,1)+mbzt.substr(7,1);
   return temp;
}
int main()
{  
    //cin>>target_zt;
    target_zt="";
    for(int i=0;i<8;i++){
        int d;
        cin>>d;
        target_zt=target_zt+char(d+48);
    }     
    //初始状态入队
    q.push({target_zt,""});
    s.insert(target_zt);   
    while (!q.empty()){        
        //取头状态数据
        string tzhuangtai=q.front().mbzt;       string tdongzuochuan=q.front().dongzuochuan;        
        //删除头节点
        q.pop();              
        //依据规则产生状态
        string tempzt[3];
        tempzt[0]=A_shangxia(tzhuangtai);       tempzt[1]=B_youyi(tzhuangtai);      tempzt[2]=C_zhongjianzhuan(tzhuangtai);      
        //为动作串增加新动作
        string dongzuochuan[3];
        dongzuochuan[0] =tdongzuochuan+"A";     dongzuochuan[1] =tdongzuochuan+"B";     dongzuochuan[2] =tdongzuochuan+"C";            
        //检查刚产生的3个状态情况
        for(int i=0;i<3;i++){
            //如果是目标状态则输出 
            if (tempzt[i]==start_zt){
                 cout<<dongzuochuan[i]<<endl;
                 return 0;
            }         
            //如果不是目标,且是新状态???
            if(s.count(tempzt[i])==0){
                q.push({tempzt[i],dongzuochuan[i]});
                s.insert(tempzt[i]);
            }          
        } 
    }    
    cout<<"wujie"<<endl;
    return 0;
}
 

 

 

posted @ 2023-07-23 09:56  郁佳彬  阅读(35)  评论(0)    收藏  举报