Gym 100801B Black and White(构造)

题意:给定X,Y,分别表示由'.'和'@'组成的连通块的个数。

思路:假如X<Y,我们用两部分来构造这个结果,第一部分由一个'.'连通块和Y-(X-1)割'@'连通块组成,第二个部分由X-1个'.'连通块和X-1个'@'连通块组成.

其他情况同理.

#include<bits/stdc++.h>
using namespace std;
const int maxn=10010;
int main()
{
    freopen("black.in","r",stdin);
    freopen("black.out","w",stdout);
    int N,M,i; 
    scanf("%d%d",&M,&N); //B+W
    if(N==M){
        cout<<1<<" "<<N+M<<endl;
        for(i=1;i<=N+M;i++) 
         if(i&1) putchar('.');//W
         else putchar('@');//B
    }
    if(N>M){
        int same=M-1;
        int L=(N-same)*2+1;
        cout<<2<<" "<<L+same*2<<endl;
        for(i=1;i<=L;i++) 
         if(i&1) putchar('@');
         else putchar('.'); 
        for(i=1;i<=same;i++) putchar('.'),putchar('@');
        putchar('
');
        for(i=1;i<=L;i++) {
            putchar('@');
        }
        for(i=1;i<=same;i++) putchar('.'),putchar('@');
    }
    if(M>N){
        int same=N-1;
        int L=(M-same)*2+1;
        cout<<2<<" "<<L+same*2<<endl;
        for(i=1;i<=L;i++) 
         if(i&1) putchar('.');
         else putchar('@');
        for(i=1;i<=same;i++) putchar('@'),putchar('.');
        putchar('
');
        for(i=1;i<=L;i++) {
            putchar('.');
        }
        for(i=1;i<=same;i++) putchar('@'),putchar('.');
    }
    return 0; 
}
原文地址:https://www.cnblogs.com/hua-dong/p/9460746.html