AtCoder ABC周赛2023 12/10 (Sun) D题题解
2023-12-13 14:03:38
目录
原题截图:
?
?
题目大意:
给定两个?的矩阵??和?。
你每次可以交换矩阵??的相邻两行中的所有元素或是交换两列中的所有元素。
请问要使??变换至??至少需要几步操作?
如果无法变换至?,则输出?-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;
}
文章来源:https://blog.csdn.net/a613322/article/details/134968993
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!