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

目录

原题截图:

题目大意:

主要思路:

注:

代码:


原题截图:

AtCoder ABC周赛2023 12/10 (Sun) D题题解_第1张图片

AtCoder ABC周赛2023 12/10 (Sun) D题题解_第2张图片 AtCoder ABC周赛2023 12/10 (Sun) D题题解_第3张图片

AtCoder ABC周赛2023 12/10 (Sun) D题题解_第4张图片 AtCoder ABC周赛2023 12/10 (Sun) D题题解_第5张图片

AtCoder ABC周赛2023 12/10 (Sun) D题题解_第6张图片

题目大意:

给定两个n \times m 的矩阵 A 和 B

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

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

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

主要思路:

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

注:

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

代码:

#include
using namespace std;
int n,m;
vector> a(10,vector(10)),b(10,vector(10));
bool equation(vector> a,vector> 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> x;
	int cnt;
};
map>,bool> mp;
void bfs()
{
	queue q;
	q.push({a,0});
	mp[a] = 1;
	while(!q.empty())
	{
		node tmp=q.front();
		q.pop();
		if(equation(tmp.x,b))
		{
			cout<>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;
}

你可能感兴趣的:(题解,c++,算法,题解,bfs,队列)