Codeforces Round #480 (Div. 2) B - Marlin 对称构造

题意:

4*n (n为奇数)的矩形格子上面见商店,只能在2*(n-2)的内部建造,使得左上角到右下角和左下角到右上角的“最短路径条数相等”;

思路:

“最短路径条数相等”,因为只能上下左右移动,所以一个只能往右或下移动,一个只能往右或上移动;

我们大致可以想到构造上下对称的局面,使得两个人所 都能经过同样的点;

多推一下可以发现有几种情况:

m为偶数,直接上下对称两部分

m为奇数,可以“一”和“凹”两种情况;


#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 7;
typedef long long ll;

int n, m;
int a[maxn];
vector<int> vec;
map<int, int> mp;
set<int> st;



int main() {
    scanf("%d%d", &n, &m);
//    if(m%2 == 0 || m <= (n-2)) {
        puts("YES");
        if(m%2 == 0) {
            int t = m/2;
            for(int i = 1; i <= 2; ++i) {
                for(int j = 1; j <= n; ++j) {
                    if(i == 2 && j > 1 && t) {
                        printf("#"); t--;
                    }
                    else printf(".");
                }
             puts("");
            }
            for(int i = 1; i <= 2; ++i) {
                t = m/2;
                for(int j = 1; j <= n; ++j) {
                    if(i == 1 && j > 1 && t) {
                        printf("#"); t--;
                    }
                    else printf(".");
                }puts("");
            }

        }
        else if(m <= n-2) {
            int t = (n-m) / 2;
            for(int i = 0; i < n; ++i) printf("."); puts("");
            for(int i = 1; i <= n; ++i) {
                if(i > t && m) { printf("#"); m--; }
                else printf(".");
            }puts("");
            for(int i = 0; i < n; ++i) printf(".");puts("");
            for(int i = 0; i < n; ++i) printf(".");puts("");
        }
        else {
            for(int i = 0; i < n; ++i) printf("."); puts("");
            for(int i = 1; i <= n; ++i) {
                if(i > 1 && i < n) { printf("#"); m--; }
                else printf(".");
            }puts("");
            int t = (n/2) - (m/2), t2 = m/2;
            for(int i = 1; i <= (n/2); ++i) {
                if(i > 1 && t2) { printf("#"); t2--; }
                else printf(".");
            } printf(".");
            int t3 = (n/2)-(m/2)-1; t2 = m/2;
            for(int i = 1; i <= (n/2); ++i) {
                if(i > t3 && t2) {
                    printf("#"); t2--;
                }
                else printf(".");
            } puts("");
            for(int i = 0; i < n; ++i) printf(".");puts("");
        }
//    }
//    else {
//        puts("NO");
//    }

    return 0;
}






猜你喜欢

转载自blog.csdn.net/xiang_6/article/details/80261996