小红开锁顺时针没看到写了1小时系列
如题
#include<bits/stdc++.h>
using namespace std;
using i64 = long long;
#define int long long
void solve() {
int n;
cin >> n;
vector<vector<char>> e(n * 2 + 1, vector<char>(n * 2 + 1));
n *= 2;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
cin >> e[i][j];
}
}
vector<pair<int, int>> sta(n + 1);
auto find = [&](int C) -> void {
for (int i = C; i <= n - C + 1; i++) {
if (e[C][i] == 'X') {
if (i + 1 <= n - C + 1 && e[C][i + 1] == 'O') {
sta[C] = make_pair(C, i);
return;
}
if (i == n - C + 1 && e[C + 1][n - C + 1] == 'O') {
sta[C] = make_pair(C, i);
return;
}
}
}
for (int i = C; i <= n - C + 1; i++) {
if (e[i][C] == 'X') {
if (i - 1 >= C && e[i - 1][C] == 'O') {
sta[C] = make_pair(i, C);
return;
}
if (i == C && e[C][C + 1] == 'O') {
sta[C] = make_pair(C, C);
return;
}
}
}
for (int i = C; i <= n - C + 1; i++) {
if (e[n - C + 1][i] == 'X') {
if (i - 1 >= C && e[n - C + 1][i - 1] == 'O') {
sta[C] = make_pair(n - C + 1, i);
return;
}
if (i == C && e[n - C][C] == 'O') {
sta[C] = make_pair(n - C + 1, C);
return;
}
}
}
for (int i = C; i <= n - C + 1; i++) {
if (e[i][n - C + 1] == 'X') {
if (i + 1 <= n - C + 1 && e[i + 1][n - C + 1] == 'O') {
sta[C] = make_pair(i, n - C + 1);
return;
}
if (i == n - C + 1 && e[n - C + 1][n - C] == 'O') {
sta[C] = make_pair(i, n - C + 1);
return;
}
}
}
};
for (int i = 1; i <= n / 2; i++) {
find(i);
}
vector<vector<pair<int, int>>> need(5, vector<pair<int, int>> (n + 1));
for (int i = 1; i <= n / 2; i++) {
need[1][i] = make_pair(i, n / 2);
need[2][i] = make_pair(n / 2, n - i + 1);
need[3][i] = make_pair(n - i + 1, n / 2 + 1);
need[4][i] = make_pair(n / 2 + 1, i);
}
auto clo = [&](pair<int, int> from, pair<int, int> to, int cheng) -> i64 {
int x1 = from.first, y1 = from.second;
int x2 = to.first, y2 = to.second;
int cou = 0;
while (x1 != x2 || y1 != y2) {
if (x1 == cheng) {
if (y1 + 1 <= n - cheng + 1) y1++;
else {
x1++;
}
}
else if (y1 == n + 1 - cheng) {
if (x1 + 1 <= n - cheng + 1) {
x1++;
}
else y1--;
}
else if (x1 == n - cheng + 1) {
if (y1 - 1 >= cheng) {
y1--;
}
else {
x1--;
}
}
else {
if (x1 - 1 >= cheng) {
x1--;
}
else {
y1++;
}
}
cou++;
}
return cou;
};
i64 ans = 1e9 + 7;
for (int i = 1; i <= 4; i++) {
i64 res = 0;
for (int j = 1; j <= n; j++) {
int dx = need[i][j].first, dy = need[i][j].second;
int xx = sta[j].first, yy = sta[j].second;
res += clo(sta[j], need[i][j], j);
}
//cerr << "res : " << res << '\n';
ans = min(ans, res);
}
cout << ans << '\n';
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int t = 1;
while(t--) {
solve();
}
return 0;
}

