分析:
很有趣的一道题目啊。。。
毕竟是构造题,没什么思路可言,这里直接给出两种构造方式:
当然,首先排除掉
或
为奇数的情况,
对于n、m都为偶数的情况:
这里只讨论
的情况(如果
把矩形横过来看即可)
第一列全为”(“,最后一列全为”)”
中间按照行和列的奇偶性
这么放的答案为
第一行与第一列全为“(”,最后一行与最后一列全为“)”(相交的位置任意放)
中间还是按照行和列的奇偶性放
这么放的答案为
当 时,使用1方案,否则使用2方案
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<map>
#define SF scanf
#define PF printf
#define MAXN 210
using namespace std;
int t,n,m;
int a[MAXN][MAXN];
int main(){
SF("%d",&t);
while(t--){
SF("%d%d",&n,&m);
if(n%2==1){
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
a[i][j]=(j<=(m/2));
}
else if(m%2==1){
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
a[i][j]=(i<=(n/2));
}
else {
if(min(n,m)<=4){
if(n<m){
for(int i=1;i<=m;i++){
a[1][i]=1;
a[n][i]=0;
}
for(int i=2;i<n;i++)
for(int j=1;j<=m;j++){
a[i][j]=((j%2)^(i%2));
}
}
else{
for(int i=1;i<=n;i++){
a[i][1]=1;
a[i][m]=0;
}
for(int i=1;i<=n;i++)
for(int j=2;j<m;j++){
a[i][j]=((j%2)^(i%2));
}
}
}
else{
for(int i=1;i<=m;i++)
a[1][i]=1;
for(int i=1;i<n;i++)
a[i][1]=1;
for(int i=2;i<=n;i++)
a[i][m]=0;
for(int i=1;i<=m;i++)
a[n][i]=0;
for(int i=2;i<n;i++)
for(int j=2;j<m;j++)
a[i][j]=((i%2)^(j%2));
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(a[i][j]==1)
PF("(");
else
PF(")");
}
PF("\n");
}
}
}