#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <algorithm>
#include <iostream>
#include <math.h>
#include"queue"
#include"set"
#include"string"
#include"vector"
using namespace std;
int dir[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
char flag[4]={'u','d','l','r'};
const string End="12345678x";
set<string>visit;
struct point{
int x,y;
};
bool check(int x,int y)
{
return x>=0&&x<3&&y>=0&&y<3;
}
int idx(string s)
{
for(int i=0;i<(int)s.size();i++)
if(s[i]=='x')
return i;
return -1;
}
struct String{
string s;//信息
string a;//路径
String()
{
s.resize(9);
a="";
}
friend bool operator < (String A,String B)
{
return A.s<B.s;
}
}Start;
string bfs()
{
queue<String>sq;
sq.push(Start);
visit.insert(Start.s);
while(!sq.empty())
{
String cur=sq.front();
sq.pop();
for(int i=0;i<4;i++)
{
String next=cur;
int fuck=idx(cur.s);
//cout<<"fuck:"<<fuck<<" ";
point fuck2;fuck2.x=fuck/3;fuck2.y=fuck%3;
// cout<<check(fuck2.x+dir[i][0],fuck2.y+dir[i][1])<<endl;
if(check(fuck2.x+dir[i][0],fuck2.y+dir[i][1])) //不出界
{
int fuck3=(fuck2.x+dir[i][0])*3+(fuck2.y+dir[i][1]);
//cout<<"fuck3:"<<fuck3<<"";
char t=next.s[fuck];next.s[fuck]=next.s[fuck3];next.s[fuck3]=t;
next.a=cur.a;
if((int)visit.count(next.s)==0)
{
next.a+=flag[i];
if(next.s==End) return next.a;
visit.insert(next.s);
sq.push(next);
}
}
}
}
}
int main()
{
//freopen("a.txt","r",stdin);
while(cin>>Start.s[0]>>Start.s[1]>>Start.s[2]>>Start.s[3]>>Start.s[4]>>Start.s[5]>>Start.s[6]>>Start.s[7]>>Start.s[8])
{
//cout<<"Start:"<<Start.s<<endl;
Start.a="";
visit.clear();
//if(Start.s==End) cout<<"don't need to move"<<endl;
cout<<bfs()<<endl;
}
return 0;
}
第一次写八数码 速度太慢了 set也爆了。
最新推荐文章于 2020-08-02 20:41:49 发布