题意:给你一个4*n的网格,保证n为奇数,让你在其中放k个障碍物,不能放在边界的格子上,使得从左上角走到右下角的最短路的方案数,恰好等于从左下角走到右上角的最短路的方案数。
k为偶数时,以纵向为对称轴进行摆放即可。
k为奇数且小于等于n-2时,如下图横向对称摆放:
...........
...........
...#####...
...........
k等于n时,如下图:
.............
.#.........#.
.###########.
.............
k大于n时,在上图空闲的位置随便填即可。
#include<cstdio>
using namespace std;
int n,K;
char a[6][105];
int main(){
scanf("%d%d",&n,&K);
for(int i=1;i<=4;++i){
for(int j=1;j<=n;++j){
a[i][j]='.';
}
}
puts("YES");
if(K%2==0){
K/=2;
for(int i=1;i<=K;++i){
a[2][i+1]=a[3][i+1]='#';
}
}
else{
if(n==1){
a[2][2]='#';
}
else if(K<=n-2){
for(int i=1,j=(n-K)/2+1;i<=K;++i,++j){
a[3][j]='#';
}
}
else if(K==n){
for(int i=1,j=2;i<=n-2;++i,++j){
a[3][j]='#';
}
a[2][2]=a[2][n-1]='#';
}
else{
for(int i=1,j=2;i<=n-2;++i,++j){
a[3][j]='#';
}
a[2][2]=a[2][n-1]='#';
for(int i=3,j=1;i<=n-2 && j<=K-n;++i,++j){
a[2][i]='#';
}
}
}
for(int i=1;i<=4;++i){
for(int j=1;j<=n;++j){
putchar(a[i][j]);
}
puts("");
}
return 0;
}