题意:
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; }