Description
要求构造一个
n×m
矩阵,使得其中
′@′
的连通块有
A
个,
Input
两个整数 A,B(1≤A,B≤1000)
Output
输出一个 n×m 矩阵使得其满足条件
Sample Input
2 3
Sample Output
6 7
@@@@@@@
@.@@@@@
@@…@@
@@@@@@@
…….
@@@@@@@
Solution
为方便起见,直接以
a
表示
如果
A=B
,那么直接一个
a
一个
如果 A≠B ,不妨假设 A>B ,考虑三种基本构造
1.奇数行一个
a
一个
2.一行
3.由于
b
连通块少,考虑用
综合上述三种结构,首先
B−−
表示要拿一个
b
连通块去构造多的
Code
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set>
#include<ctime>
using namespace std;
typedef long long ll;
typedef pair<int,int>P;
const int INF=0x3f3f3f3f,maxn=100001;
int main()
{
freopen("black.in","r",stdin);
freopen("black.out","w",stdout);
int A,B;
while(~scanf("%d%d",&A,&B))
{
if(A==B)
{
printf("1 %d\n",2*A);
for(int i=1;i<=A;i++)printf("@.");
printf("\n");
}
else
{
char a='@',b='.';
if(A<B)swap(A,B),swap(a,b);
B--;
printf("%d 80\n",2*(B%40)+1+80+B/40);
int num=A-(B%40+1+40*max(0,B/40-1));
for(int i=1;i<=80;i++)
{
if(i&1)
for(int j=1;j<=80;j++)
{
if((j&1)&&num)printf("%c",a),num--;
else printf("%c",b);
}
else
for(int j=1;j<=80;j++)printf("%c",b);
printf("\n");
}
for(int i=1;i<=B%40;i++)
{
for(int j=1;j<=80;j++)printf("%c",a);
printf("\n");
for(int j=1;j<=80;j++)printf("%c",b);
printf("\n");
}
for(int i=1;i<=80;i++)printf("%c",a);
printf("\n");
for(int i=1;i<=B/40;i++)
{
if(i&1)
for(int j=1;j<=40;j++)printf("%c%c",a,b);
else
for(int j=1;j<=40;j++)printf("%c%c",b,a);
printf("\n");
}
}
}
return 0;
}