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