Codeforces 980B

渔托邦可以想象成一个 4行,奇数列的网格。 它有两个主要的村庄; 第一个位于左上角(1,1),在那里的人喜欢在右下角的池(4,n)捕鱼。 第二个村庄位于(4,1),人们喜欢在左下角(1,n)的鲑鱼池塘。
 
渔托邦的市长希望在城市中放置 k 个酒店,每个酒店都占用一个网格。 为了让人们可以从任何地方进入城市,不能将酒店放在边上。
 
如果这些单元格没有被酒店占用并且有一共同边,则一个人可以从一个单元移动到另一个单元。
 
你能帮助市长安排酒店,使从每个村庄到其池塘的最短路径的数量相等吗?

Input

第一行输入包含两个整数,n 和 k(3 ≤ n ≤ 99,0 ≤ k ≤ 2 ×(n - 2)),n是奇数。 n和k 代表城市的宽度,以及要建设的酒店数量 。

Output

如果可以以满足问题陈述的方式放置所有酒店,则输出“YES”,否则输出“NO”。
 
如果可能的话,输出另外 4 行描述城市的行,每行应该有 n 个字符,如果该单元格上有酒店,则字符是“#”,如果是空地,字符是“.” 。

Sample Input

Input
7 2
Output
YES
.......
.#.....
.#.....
.......
Input
5 3
Output
YES
.....
.###.
.....
.....

题目要求从左上到右下和从左下到右上的最短路径的数目一样
考虑矩阵对称性
若n为偶数在第二行第三行(第二列开始)每次放两个 使矩阵关于x轴对称
若n为奇数先尽可能第二行放满(从中间向两边放),剩下的从两边向中间放,使矩阵关于y轴对称
第一遍在每个字符间多加了空格,wa了,找了半天。

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

int main()
{
    char s[4][120]= {0};
    int i,j,a,b,d,e;
    cin>>a>>b;
    memset(s,'.',sizeof(s));

    printf("YES
");
    if(b%2==0)
    {
        d=1;
        for(i=1; i<3; i++)
        {
            d=1;
            for(j=0; j<b/2; j++)
                s[i][d++]='#';
        }
    }
    else
    {
        e=b;
        s[1][a/2]='#';
        e--;
        for(i=1; i<a/2; i++)
        {
            if(e==0)
                break;
            s[1][a/2-i]='#';
            s[1][a/2+i]='#';
            e-=2;
        }
        if(e>0)
        {
            for(i=1; i<=e/2; i++)
            {
                s[2][i]='#';
                s[2][a-i-1]='#';
            }
        }
    }

    for(i=0; i<4; i++)
    {
        for(j=0; j<a; j++)
        {
                printf("%c",s[i][j]);
        }
        printf("
");
    }

    return 0;
}