AOJ Seven Puzzle(BFS+状态转移)

题意:
这里写链接内容

#include<iostream>
#include<algorithm>
#include<cstring>
#include<queue>
#include<cstdio>
#include<map>
#define inf 0x3f3f3f3f
using namespace std;
typedef long long ll;
typedef pair<int,int> PII;
#define maxn 400
map<string,int> mp;
ll dir[4]={1,-1,-4,4};

void bfs(string ss){
    queue<string> que;
    que.push(ss);
    mp[ss]=1;

    while(!que.empty()){
        string s;
        s=que.front(); que.pop();
        for(int i=0;i<4;i++){
            ll pos=s.find('0');
            ll nx=pos+dir[i];   //可能移动数字的位置
            ////空格在3的时候,4不能挪动,因为3 4 不相邻,反之同理  
            if(nx<0||nx>7||(pos==4&&nx==3)||(pos==3&&nx==4))
                continue;
            string q=s;     //为了记录下面一个状态 
            swap(q[pos],q[nx]);     //移动物块 
            if(!mp[q]){
                que.push(q);
                mp[q]=mp[s]+1; 
            }   
        }
    }


}
int main(){
    int num;
    string st="01234567";   //起始状态
    bfs(st);    //把由起点开始出发的所有状态算出来

    while(cin>>num){
        st[0]=num+'0';
        for(int i=1;i<8;i++){
            cin>>num;
            st[i]=num+'0';
        }
        cout<<mp[st]-1<<endl;
    } 
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_37360631/article/details/81637955