目录
?
?
给定两个?的矩阵??和?。
你每次可以交换矩阵??的相邻两行中的所有元素或是交换两列中的所有元素。
请问要使??变换至??至少需要几步操作?
如果无法变换至?,则输出?-1
。
这个题正解不好想,但我们看一下数据范围:H,W<=5。我们可以暴力bfs,但我们要枚举有效数组,所以用一个map记录,就做成了。
不要再函数中开数组,用vector<vector<int>>。
#include<bits/stdc++.h>
using namespace std;
int n,m;
vector<vector<int>> a(10,vector<int>(10)),b(10,vector<int>(10));
bool equation(vector<vector<int>> a,vector<vector<int>> b)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(a[i][j]!=b[i][j])
{
return 0;
}
}
}
return 1;
}
struct node{
vector<vector<int>> x;
int cnt;
};
map<vector<vector<int>>,bool> mp;
void bfs()
{
queue<node> q;
q.push({a,0});
mp[a] = 1;
while(!q.empty())
{
node tmp=q.front();
q.pop();
if(equation(tmp.x,b))
{
cout<<tmp.cnt;
exit(0);
}
for(int i=1;i<n;i++)
{
swap(tmp.x[i],tmp.x[i+1]);
if(!mp.count(tmp.x))
{
q.push({tmp.x,tmp.cnt+1});
mp[tmp.x] = 1;
}
swap(tmp.x[i],tmp.x[i+1]);
}
for(int i=1;i<m;i++)
{
for(int j=1;j<=n;j++)
{
swap(tmp.x[j][i],tmp.x[j][i+1]);
}
if(!mp.count(tmp.x))
{
q.push({tmp.x,tmp.cnt+1});
mp[tmp.x] = 1;
}
for(int j=1;j<=n;j++)
{
swap(tmp.x[j][i],tmp.x[j][i+1]);
}
}
}
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>a[i][j];
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>b[i][j];
}
}
bfs();
cout<<-1;
return 0;
}