当前位置: 代码迷 >> 综合 >> AOJ Seven Puzzle(BFS+状态转移)
  详细解决方案

AOJ Seven Puzzle(BFS+状态转移)

热度:73   发布时间:2023-11-08 15:50:40.0

题意:
这里写链接内容

#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;
}