这个
#include<bits/stdc++.h>
using namespace std;
#define vvi vector<vector<int>>
#define pvi pair<vvi,int>
#define x first
#define endl '\n'
int n,m;
vvi st,ed;
int dx[4]={1,0,-1,0},dy[4]={0,1,0,-1};
int extend(queue<pvi>&q,map<vvi,int>&da,map<vvi,int>&db)
{
pvi t=q.front();
q.pop();
vvi u=t.first;
if(db.count(u))return da[u]+db[u];
int sx,sy;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
if(u[i][j]==0)sx=i,sy=j;
vvi s=u;
for(int i=0;i<4;i++)
{
u=s;
int ux=sx+dx[i],uy=sy+dy[i];
if(ux<0||ux>=n||uy<0||uy>=m)continue;
swap(u[ux][uy],u[sx][sy]);
if(da.count(u)==0||da[u]>da[s]+1)
{
da[u]=da[s]+1;
q.push(make_pair(u,da[u]));
if(db.count(u))return da[u]+db[u];
}
}
return 25;
}
int bfs()
{
queue<pvi>qa,qb;
map<vvi,int>da,db;
qa.push(make_pair(st,0));qb.push(make_pair(ed,0));
da[st]=0,db[ed]=0;
while(qa.size()&&qb.size())
{
if(da[qa.front().x]+db[qb.front().x]>24)return -1;
int t;
if(qa.size()<=qb.size())
{
t=extend(qa,da,db);
}
else t=extend(qb,db,da);
if(t<=24)return t;
}
return 0;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{ vector<int>t,tt;
for(int j=1;j<=m;j++)
{
int a;
cin>>a;
t.push_back(a);
tt.push_back(m*(i-1)+j);
}
st.push_back(t);
ed.push_back(tt);
}
ed[n-1][m-1]=0;
cout<<bfs()<<endl;
return 0;
}