#include<iostream>
#include<map>
#include<queue>
#include<stack>
using namespace std;
queue<int>Q;
map<int, int>vis;
map<int, int>step;
map<int,int>parent;
stack<int>out;
int dis[4][2] = { -1,0,0,1,1,0,0,-1 };
int u, v;
int change(int** p, int a, int b)
{
int t = 0;
for (int i = 0; i < a; i++)
for (int j = 0; j < b; j++)
t = t * 10 + p[i][j];
return t;
}
int bfs(int** p, int a, int b)
{
int x, y, uu;
Q.push(u);
vis[u] = 1;
step[u] = 0;
while (Q.size())
{
uu = u = Q.front();
Q.pop();
if (u == v)
return step[v];
for(int i=a-1;i>=0;i--)
for (int j = b - 1; j >= 0; j--)
{
p[i][j] = uu % 10, uu = uu / 10;
if (p[i][j] == 0)
x = i, y = j;
}
for (int i = 0; i < 4; i++)
{
int nu;
if (!(x == 0 && i == 0) && !(y == b - 1 && i == 1) && !(x == a - 1 && i == 2) && !(y == 0 && i == 3))
{
p[x][y] = p[x + dis[i][0]][y + dis[i][1]], p[x + dis[i][0]][y + dis[i][1]] = 0;
nu = change(p, a, b);
if (!vis[nu])
{
Q.push(nu);
vis[nu] = 1;
step[nu] = step[u] + 1;
parent[nu] = u;
}
p[x + dis[i][0]][y + dis[i][1]] = p[x][y], p[x][y] = 0;
}
}
}
return -1;
}
int main()
{
cout << "广度搜索" << endl;
int m, n, s, t;
int** mau, ** mav;
cout << "输入m*n;" << endl;
cin >> m >> n;
mau = new int* [n], mav = new int* [n];
for (int i = 0; i < n; i++)
mau[i] = new int[m], mav[i] = new int[m];
cout << "初始状态:" << endl;
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++)
cin >> mau[i][j];
cout << "最终状态:" << endl;
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++)
cin >> mav[i][j];
u = change(mau, m, n), v = change(mav, m, n);
s = bfs(mau, m, n);
if (s != -1)
{
cout << "到达目标状态需要 " << s << " 步" << endl;
t = v;
while (t)
{
out.push(t);
t = parent[t];
}
while (out.size())
{
int** o;
t = out.top();
out.pop();
o = new int* [n];
for (int i = 0; i < n; i++)
o[i] = new int[m];
for (int i = m - 1; i >= 0; i--)
for (int j = n - 1; j >= 0; j--)
o[i][j] = t % 10, t /= 10;
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
cout << o[i][j] << " ";
cout << endl;
}
cout << "======" << endl;
}
}
else cout << "无解" << endl;
}