ABC 218 C、D(思维 E(最小生成树 F(最短路

本文展示了使用C++编程解决矩阵旋转及查找问题的代码实例,包括矩阵旋转后的匹配检查、矩形数量计算和最短路径求解等算法。涉及二分查找、并查集和迪杰斯特拉算法的应用。

C - Shapes

比较有意思的一道题
存到vector一个一个匹配就行

code:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn = 2e2 + 9;
const ll mod = 998244353;
const ll inf = 0x3f3f3f3f;
ll n, m, k;
ll sum = 0;
char s[maxn][maxn], t[maxn][maxn];
char m2[maxn][maxn],m3[maxn][maxn], m4[maxn][maxn];
vector <pair<int,int> > vt;
bool check(char a[][maxn])
{
   
   
	vector <pair<int,int> > va;
	for(int i = 1; i <= n; ++i)
		for(int j = 1; j <= n; ++j)
			if(a[i][j] == '#')
				va.push_back({
   
   i, j});
	if(va.size() != vt.size()) return false;
	else 
	{
   
   
		int mx = va[0].first - vt[0].first, my = va[0].second - vt[0].second;
		for(int i = 1; i < va.size(); ++i)
		{
   
   
			if(va[i].first - vt[i].first != mx ||  va[i].second - vt[i].second != my)
				return false;
		}
		return true;
	}
}
void work()
{
   
   
	cin >> n;
	for(int i = 1; i <= n; ++i)
		cin >> (s[i] + 1);
	for(int i = 1; i <= n; ++i)
	{
   
   
		cin >> (t[i] + 1);
		for(int j = 1; j <= n; ++j)
			if(t[i][j] == '#')
				vt.push_back({
   
   i, j});
	}
	for(int i = 1; i <= n; ++i)
		for(int j = 1; j <= n; ++j)
			m2[i][n-j+1] = s[j][i];
	for(int i = 1; i <= n; ++i)
		for(int j = 1; j <= n; ++j)
			m3[i][n-j+1] = m2[j][i];		
	for(int i = 1; i <= n; ++i)
		for(int j = 1; j <= n; ++j)
			m4[i][n-j+1] = m3[j][i];
			
	if(check(s) || check(m2) || check(m3) || check(m4))
		cout << "Yes\n";
	else cout << "No\n";
}

int main()
{
   
   
	ios::sync_with_stdio(0);
	//int TT;cin>>TT;while(TT--)
	work();
	return 0;
}

D - Rectangles
题意:给你 n n n 个点,找这 n n n 个点能组成多少矩阵
思路:找矩阵对角线,标记已经找过的对角线
code:
(map太慢了)

#include
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值