题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6400
题意:给出n,m 。构造出一个行、列符合括号匹配最大的数的矩阵
分析:
n,m均为奇数,结果为0个
n,m有一个为奇数,结果为那个奇数
n,m均为偶数
一般情况构造如下:舍弃第一行和最后一行,满足尽可能多的列,舍弃第一列和最后一列,满足尽可能多的行,可以得到这种情况为n+m-4个
.((((.
()()()
(()())
()()()
(()())
()()()
(()())
.)))).
但是在n,m较小的特殊情况需要特判一下,比如n = 4,m = 4,按照上面的构造虽然舍弃了两列,但是只增加了两个行,但是如下构造可以增加两个列和一半的行,结果为m + n / 2 - 1(m > n,n > m同理)
((((
(())
))((
))))
m + n / 2 - 1 = n + m - 4 =>n = 6 n < 6时选第二种,反之选第一种
代码:
#include<bits/stdc++.h>
using namespace std;
char res[210][210];
void solve(int n,int m)
{
if(n % 2 != 0 && m % 2 != 0)
{
for(int j = 1; j <= n; j++)
{
for(int k = 1; k <= m; k++)
res[j][k] = '(';
}
}
else if(n % 2 != 0 || m % 2 != 0)
{
if(n % 2 != 0)
{
for(int j = 1; j <= n; j++)
{
for(int k = 1; k <= m; k++)
{
if(k <= m / 2)
res[j][k] = '(';
else
res[j][k] = ')';
}
}
}
else
{
for(int j = 1; j <= m; j++)
{
for(int k = 1; k <= n; k++)
{
if(k <= n / 2)
res[k][j] = '(';
else
res[k][j] = ')';
}
}
}
}
else
{
if(min(n,m) < 6)
{
if(n <= m)
{
for(int j = 1; j <= n; j++)
{
for(int k = 1; k <= m; k++)
{
if(j == 1)res[j][k] = '(';
else if(j == n)res[j][k] = ')';
else
{
if(j <= n / 2)
{
if(k <= m / 2)
{
res[j][k] = '(';
}
else
{
res[j][k] = ')';
}
}
else
{
if(k <= m / 2)
res[j][k] = ')';
else
res[j][k] = '(';
}
}
}
}
}
else
{
for(int j = 1; j <= m; j++)
{
for(int i = 1; i <= n; i++)
{
if(j == 1)res[i][j] = '(';
else if(j == m)res[i][j] = ')';
else
{
if(i <= n / 2)
{
if(j <= m / 2)
{
res[i][j] = '(';
}
else
{
res[i][j] = ')';
}
}
else
{
if(j <= m / 2)
{
res[i][j] = ')';
}
else
{
res[i][j] = '(';
}
}
}
}
}
}
}
else
{
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= m; j++)
{
if(j == 1 || i == 1)res[i][j] = '(';
else if(j == m || i == n)res[i][j] = ')';
else
{
if(i % 2 == 0)
{
if(j % 2)res[i][j] = '(';
else res[i][j] = ')';
}
else
{
if(j % 2)res[i][j] = ')';
else res[i][j] = '(';
}
}
}
}
}
}
}
int main()
{
int t;
cin>>t;
for(int i = 1; i <= t; i++)
{
int n,m;
scanf("%d%d",&n,&m);
solve(n,m);
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= m; j++)
printf("%c",res[i][j]);
printf("\n");
}
}
return 0;
}