题意:
这里写链接内容
#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;
}