计蒜客:三阶平面魔方(BFS)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
思路:
写一个函数来进行相应的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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值