Problem Description
A parentheses matrix is a matrix where every element is either '(' or ')'. We define the goodness of a parentheses matrix as the number of balanced rows (from left to right) and columns (from up to down). Note that:
- an empty sequence is balanced;
- if A is balanced, then (A) is also balanced;
- if A and B are balanced, then AB is also balanced.
For example, the following parentheses matrix is a 2×4 matrix with goodness 3, because the second row, the second column and the fourth column are balanced:
)()(
()()
Now, give you the width and the height of the matrix, please construct a parentheses matrix with maximum goodness.
Input
The first line of input is a single integer T (1≤T≤50), the number of test cases.
Each test case is a single line of two integers h,w (1≤h,w≤200), the height and the width of the matrix, respectively.
Output
For each test case, display h lines, denoting the parentheses matrix you construct. Each line should contain exactly w characters, and each character should be either '(' or ')'. If multiple solutions exist, you may print any of them.
Sample Input
3 1 1 2 2 2 3
Sample Output
( () )( ((( )))
构造题,遇事不决就打表。
需要打表找规律,才能找出题解的规律。

代码:
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=1e5+10;
const double INF=0x3f3f3f3f;
char ma[220][220];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n,m;
memset(ma,' ',sizeof(ma));
scanf("%d%d",&n,&m);
if((n&1)&&(m&1))
{
for(int i=1; i<=n; i++)
{
for(int j=1; j<=m; j++)
{
printf("(");
}
printf("\n");
}
}
if(!(n&1)&&(m&1))
{
for(int i=1; i<=n; i++)
{
for(int j=1; j<=m; j++)
{
if(i&1)printf("(");
else printf(")");
}
printf("\n");
}
}
if((n&1)&&!(m&1))
{
for(int i=1; i<=n; i++)
{
for(int j=1; j<=m; j+=2)
{
printf("()");
}
printf("\n");
}
}
if(!(n&1)&&!(m&1))//都是偶数
{
if(n<6||m<6) //特殊讨论
{
if(n<=m)
{
for(int i=1; i<=n; i++)
{
for(int j=1; j<=m; j++)
{
if(i==1)ma[i][j]='(';
else if(i==n)ma[i][j]=')';
else if((i&1)==0)
{
if(j<=(m/2))ma[i][j]=')';
else ma[i][j]='(';
}
else
{
if(j<=(m/2))ma[i][j]='(';
else ma[i][j]=')';
}
}
}
}
else
{
for(int i=1;i<=m;i++)
{
for(int j=1;j<=n;j++)
{
if(i==1)ma[j][i]='(';
else if(i==m)ma[j][i]=')';
else if((i&1)==0)
{
if(j<=(n/2))ma[j][i]=')';
else ma[j][i]='(';
}
else
{
if(j<=(n/2))ma[j][i]='(';
else ma[j][i]=')';
}
}
}
}
for(int i=1; i<=n; i++)
{
for(int j=1; j<=m; j++)
{
printf("%c",ma[i][j]);
}
printf("\n");
}
continue;
}
for(int i=1; i<=m; i++)ma[1][i]='(';
for(int i=1; i<=n; i++)ma[i][1]='(';
for(int i=1; i<=m; i++)ma[n][i]=')';
for(int i=2; i<=n; i++)ma[i][m]=')';
for(int i=2; i<=n-1; i++)
{
for(int j=2; j<=m-1; j+=2)
{
if((i&1)==0)
{
ma[i][j]=')';
ma[i][j+1]='(';
}
else
{
ma[i][j]='(';
ma[i][j+1]=')';
}
}
}
for(int i=1; i<=n; i++)
{
for(int j=1; j<=m; j++)
{
printf("%c",ma[i][j]);
}
printf("\n");
}
}
}
return 0;
}

1153

被折叠的 条评论
为什么被折叠?



