Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Chương trình C++ kiểm tra hai hình ảnh khớp sau xoay và tịnh tiến

Mô tả bài toán

Hai ảnh vuông n×n pixel ('.' trắng, 'x' đen). Kiểm tra ảnh thứ 2 có khớp với ảnh 1 sau khi xoay 90° (0,1,2,3 lần) và tịnh tiến không.

Ví dụ

n=4, first={"..x.","x.x.","x.xx","xx.."}, second={"..xx","x.xx",".x.x","..x."}. Đầu ra: False (0).

Thuật toán

  1. Trích tọa độ pixel đen của 2 ảnh vào mảng a, b.
  2. Nếu số pixel khác nhau → false.
  3. Sắp xếp a. Lặp 4 lần: sắp xếp , kiểm tra có vector tịnh tiến (d1,d2) sao cho b[i] - a[i] = (d1,d2) ∀i. Nếu có → true.
  4. Xoay 90°: (x,y) → (y, n-1-x).

Đoạn mã C++

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

bool find(const vector<pair<int,int>>& x,
          const vector<pair<int,int>>& y) {
    int d1=y[0].first-x[0].first;
    int d2=y[0].second-x[0].second;
    for(int i=1;i<(int)x.size();i++)
        if(y[i].first-x[i].first!=d1 || y[i].second-x[i].second!=d2)
            return false;
    return true;
}

void rotate(int n, vector<pair<int,int>>& a,
            vector<pair<int,int>>& b) {
    for(auto &p:b) p={p.second, n-1-p.first};
}

bool solve(int n, vector<string> first, vector<string> second) {
    vector<pair<int,int>> a,b;
    for(int i=0;i

Đầu vào / Đầu ra

Input: 4, {"..x.","x.x.","x.xx","xx.."}, {"..xx","x.xx",".x.x","..x."}

Output: 0