小红开锁顺时针没看到写了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;
}

全部评论
有个稍微简单点的思路,在每一层一定有一个节点是X,从这个节点出发,找到横向的X数量和纵向的X数量进行分类讨论,虽然我写崩了(没看顺时针),但也许不失为一种好思路[摸鱼中[牛泪]
1 回复 分享
发布于 2024-11-09 10:50 河北
码量可爱
点赞 回复 分享
发布于 2024-11-08 22:40 河北

相关推荐

牛客36400893...:我不是这个专业的,但是简历确实没有吸引我的亮点,而且废话太多没耐心看
0offer是寒冬太冷还...
点赞 评论 收藏
分享
11-06 16:50
门头沟学院 Java
用微笑面对困难:word打字比赛二等奖的我,也要来凑合凑合
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务