2018 Multi-University Training Contest 8--HDU 6400 Parentheses Matrix(思维)

题意:

比如:()()()(),(((())))这种叫做合法括号序列,在行或者列上都可以。

让你生成一个 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("");
		}
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值