AtCoder ABC周赛2023 12/10 (Sun) D题题解

目录

原题截图:

题目大意:

主要思路:

注:

代码:


原题截图:

题目大意:

给定两个 的矩阵 和 。

你每次可以交换矩阵 的相邻两行中的所有元素或是交换两列中的所有元素。

请问要使 变换至 至少需要几步操作?

如果无法变换至 ,则输出 -1。

主要思路:

这个题正解不好想,但我们看一下数据范围:H,W<=5。我们可以暴力bfs,但我们要枚举有效数组,所以用一个map记录,就做成了。

注:

不要再函数中开数组,用vector<vector<int>>。

代码:

cpp 复制代码
#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;
}
相关推荐
贝壳69017 分钟前
同一道三亿位选型题,三个AI给了我三个答案,我把它们拉进同一台机器复跑
算法
汉克老师1 小时前
《从C++小白到算法高手:GESP 1—8级成长地图》第一讲:认识GESP——从编程新手到算法探索者
c++·gesp·信息学竞赛·小学生学c++
晴天的雨.9923 小时前
【C++】继承篇
java·开发语言·c++
青少儿编程课堂3 小时前
蓝桥杯青少组图形化 + 全国青少年信息素养大赛 + 电子学会图形化考级:校园大富翁经营闯关解析
c++·python·算法·bfs·信息学竞赛
another heaven3 小时前
【C/C++ 第一次跨越(上):用 C++11/14 停止制造新的旧代码】
c语言·c++·制造
qq_406981033 小时前
c++ lamda(三)Lambda表达式
java·前端·c++
在所不辞兄3 小时前
为什么在新能源汽车电驱与热管理开发中,AI驱动的数字孪生和数据驱动仿真正在部分替代对物理台架与实车标定的依赖?
人工智能·深度学习·神经网络·算法·机器学习
I_belong_to_jesus14 小时前
C++关于分支预测的优化1
开发语言·c++·算法
Rabitebla15 小时前
【Linux】进程控制(十二) 自定义 Shell(二):内建命令与进程工作目录管理
linux·c++·笔记·学习·bash