八数码

 

 

 

 

 #include<iostream>

#include<cstring>

#include<unorderd_map>

const int N=10;

int d[N];

using namespace std;

int dfs(string start){

string end="12345678x";

queue <string> q;

unoderd_map <string,int>d;//距离数组,字符串,int是用来记录距离

d[start]=0;

q.push(start);

int dx[4]={-1,0,1,0};

int dy[4]={0,1,0,-1};

while(!q.empty()){

auto t=q.front();

q.pop();

int distance=d[t]; 

if(t==end) return distance;

//状态转移

int k=t.find('x');

int x=k/3,y=k%3;

for(int i=0;i<4;i++){

int a=x+dx[i];

int b=y+dy[i];

if(x>=0&&x<3&&y>=0&&y<3)

{

swap(t[k],t[a*3+b]);//把k即x在string中的位置与(a,b)在stirng中的位置对换

if(!d.count(t)){//如果t没有被换过 距离没有+1

d[t]=distance+1;

q.push(t);//t位置进队列

}

swap(t[k],t[a*3+b]);//回溯

}

}

}

return -1;

}

 

int main(){

string start,c;

for(int i=0;i<9;i++){

cin>>c;

start+=c;

}

cout<<bfs(start)<<endl;

}

posted @ 2023-03-16 21:58  chenxinyue  阅读(20)  评论(0编辑  收藏  举报