//用的双向搜索,分别从两个方向去搜索,用map去标记,只要有一个状态重复就可以直接输出结果
#include<bits/stdc++.h>//万能头文件来一波平安
using namespace std;
map<string,int>m1;
map<string,int>m2;
struct node{
 string s;
 int we,step;
};
queue<node>q;
queue<node>p;
int dir[4]={1,-1,3,-3};
int main()
{
 node t1,t2;
 cin>>t1.s>>t2.s;
 for(int i=0;i<9;i++)
 {
  if(t1.s[i]=='.')
  t1.we=i;
  if(t2.s[i]=='.')
  t2.we=i;
 }
 if(t1.s==t2.s)
 {
  cout<<t1.step;
  return 0;
 }
 node l1,l2,h1,h2;
 t1.step=0;
 t2.step=0;
 l1.s=t1.s;
    l1.we=t1.we;
    l1.step=t1.step;
    l2.step=t2.step;
 l2.s=t2.s;
 l2.we=t2.we;
 m1[l1.s]=1;
 m2[l2.s]=1;
 q.push(l1);
 p.push(l2);
 while(!q.empty())
 {
  h1=q.front();
  h2=p.front();
  q.pop();
  p.pop();
 for(int i=0;i<4;i++)
 {
  if((i==0&&h1.we%3==2)||(i==1&&h1.we%3==0)||(i==2&&h1.we>5)||(i==3&&h1.we<3))
  continue;
  l1.we=h1.we+dir[i];
  l1.step=h1.step+1;
  l1.s=h1.s;
  if(l1.we>=0&&l1.we<=8)
  {
   swap(l1.s[l1.we],l1.s[h1.we]);
   if(m2[l1.s])
   {
    cout<<l1.step+m2[l1.s]-1;
    return 0;
   }
   if(!m1[l1.s])
   {
      m1[l1.s]=l1.step+1;
      q.push(l1);
   }
  }
 }
 for(int i=0;i<4;i++)
 {
  if((i==0&&h2.we%3==2)||(i==1&&h2.we%3==0)||(i==2&&h2.we>5)||(i==3&&h2.we<3))
  continue;
  l2.we=h2.we+dir[i];
  l2.step=h2.step+1;
  l2.s=h2.s;
  if(l2.we>=0&&l2.we<=8)
  {
   swap(l2.s[l2.we],l2.s[h2.we]);
   if(m1[l2.s])
   {
    cout<<l2.step+m1[l2.s]-1;
    return 0;
   }
   if(!m2[l2.s])
   {
      m2[l2.s]=l2.step+1;
      p.push(l2);
   }
  }
 } 
 }
    cout<<-1;
    return 0;
}

点赞(0)
 

0.0分

4 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论