atcoder点阵坐标计算两题

点阵和直角坐标系一直都对我造成了较大的困扰,现借atcoder中的两题好好总结下该类题的计算方法。
一:点阵求两图形是否全等。
题目链接:C-Shapes
题目大意:给出两个点阵,求经过旋转和平移后两图像是否全等。
方法:分别找到最左最右最上最下的坐标并记录,然后原图从左下遍历至右上,分别标记对照图从四角开始遍历的图形情况,如果有一个角遍历完成后图形与原图吻合则成立。
代码:

#include<bits/stdc++.h>
using namespace std;
int const N = 233, INF = 0x3f3f3f3f;
int n, u, d, l, r, U, D, L, R;
char a[N][N], b[N][N];
int main() {
    
    
	ios::sync_with_stdio(0);
	cin >> n;
	u = U = l = L = INF;
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= n; j++) {
    
    
			cin >> a[i][j];
			if (a[i][j] == '#')
				u = min(u, i), d = max(d, i), l = min(l, j), r = max(r, j);
		}

	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= n; j++) {
    
    
			cin >> b[i][j];
			if (b[i][j] == '#')
				U = min(U, i), D = max(D, i), L = min(L, j), R = max(R, j);
		}

	if (d - u == R - L && r - l != D - U && r - l == R - L && d - u != D - U) {
    
    
		cout << "No";
		return 0;
	}
	int f1 = 1, f2 = 1, f3 = 1, f4 = 1;
	for (int i = u; i <= d; i++)
		for (int j = l; j <= r; j++) {
    
    
			if (a[i][j] != b[D - j + l][L + i - u])f1 = 0;
			if (a[i][j] != b[U + j - l][R - i + u])f2 = 0;
			if (a[i][j] != b[U + i - u][L + j - l])f3 = 0;
			if (a[i][j] != b[D - i + u][R - j + l])f4 = 0;
		}
	cout << (f1 || f2 || f3 || f4 ? "Yes" : "No");
	return 0;
}

二:给定坐标求矩形个数
题目链接:D-Rectangles
题目大意:给定一些坐标,求构成矩形的个数,其必与x或y轴平行。
方法:此题看着简单,想想却又十分复杂,这里介绍一种巧妙的方法,先对点集进行排序,然后遍历点集,以v[i].first < v[j].first && v[i].second < v[j].second的条件防止重复找点,然后以i点的x与j点的y和i点的y和j点的x为目标二分查找区间,能找到两点,说明构成一个矩形,则记一种情况。
代码:

#include <bits/stdc++.h>
using namespace std;

int main(){
    
    
    int n; cin >> n;
    vector<pair<int,int>> v(n);
    for(int i = 0; i < n; i++) cin >> v[i].first >> v[i].second;
    sort(v.begin(), v.end());
    int ans = 0;
    
    for(int i = 0; i < n; i++) 
	    for(int j = 0; j < n; j++) 
	        if(v[i].first < v[j].first && v[i].second < v[j].second) 
			{
    
    
                if(binary_search(v.begin(), v.end(), make_pair(v[i].first, v[j].second)) && binary_search(v.begin(), v.end(), make_pair(v[j].first, v[i].second))) ans++;
            }
    
    cout << ans << endl;
}

猜你喜欢

转载自blog.csdn.net/skl4869/article/details/120519106