题意:
比如:()()()(),(((())))这种叫做合法括号序列,在行或者列上都可以。
让你生成一个 n 行 m 列尽可能多合法括号序列的矩阵。
题解:
合法括号序列的长度一定是偶数,所以可以分成4种:
1,n 为奇数 m 为奇数
因为不可能有合法括号序列,所以全填 '(';
2,n 为奇数 m 为偶数
在列上是奇数不可能有合法括号序列,但是在行上就可以,如:()()()()();
3,n 为偶数 m 为奇数
同理2;
4,n 为偶数 m 为偶数
可以想到一种构造:
((((((
( . . . . )
( . . . . )
))))))
放弃4行,最多有n+m-4个合法括号序列,在 n > 6 && m > 6 时最大。
在 n <= 6 && m <= 6 时,最优是有 n+m/2(n > m)或者 m+n/2(m > n)
但是当 n == 4, m == 4 时这就会亏一行或者一列
所以安排一下:
((((
)()(
()()
))))
ac代码:
#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <string>
#include <vector>
#include <bitset>
#include <stack>
#include <cmath>
#include <deque>
#include <queue>
#include <list>
#include <set>
#include <map>
#define mem(a) memset(a, 0, sizeof(a))
#define pi acos(-1)
using namespace std;
typedef long long ll;
char mapp[505][505];
int main(){
int t;
scanf("%d", &t);
while(t--){
int n, m;
scanf("%d %d", &n, &m);
for(int i = 0; i < n; i++){
mapp[i][0] = '\0';
}
if(n % 2 == 0 && m % 2 == 0){
if(n > 6 && m > 6){
for(int i = 0 ; i < n; i++){
for(int j = 0; j < m; j++){
if(i == 0){
mapp[i][j] = '(';
}
else if(i == n-1){
mapp[i][j] = ')';
}
else if(i%2){
mapp[i][j] = '(';
mapp[i][++j] = ')';
}
else{
if(j == 0){
mapp[i][j] = '(';
}
else if(j == m-1){
mapp[i][j] = ')';
}
else{
mapp[i][j] = '(';
mapp[i][++j] = ')';
}
}
}
mapp[i][m] = '\0';
}
}
else if(m > n){
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
if(i == 0){
mapp[i][j] = '(';
}
else if(i == n-1){
mapp[i][j] = ')';
}
else{
if(i%2){
mapp[i][j] = '(';
mapp[i][++j] = ')';
}
else{
mapp[i][j] = ')';
mapp[i][++j] = '(';
}
}
}
mapp[i][m] = '\0';
}
}
else{
for(int i = 0 ; i < n; i++){
for(int j = 0; j < m; j++){
if(i%2 == 0){
mapp[i][j] = '(';
mapp[i][++j] = ')';
}
else{
if(j == 0){
mapp[i][j] = '(';
}
else if(j == m-1){
mapp[i][j] = ')';
}
else{
mapp[i][j] = '(';
mapp[i][++j] = ')';
}
}
}
mapp[i][m] = '\0';
}
}
}
else if(n % 2 == 0){
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
if(i%2){
mapp[i][j] = ')';
}
else{
mapp[i][j] = '(';
}
}
mapp[i][m] = '\0';
}
}
else if(m % 2 == 0){
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
mapp[i][j] = '(';
mapp[i][++j] = ')';
}
mapp[i][m] = '\0';
}
}
else{
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
mapp[i][j] = '(';
}
mapp[i][m] = '\0';
}
}
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
printf("%c", mapp[i][j]);
}
puts("");
}
}
}