m m 为奇数的情况, 对于n、m都为偶数的情况:1、1、这里只讨论n>mn>m的情况(如果m>nm>n把矩形横过来看即可)第一列全为”(“,最后一列全为”..." />
当前位置: 代码迷 >> 综合 >> 【构造】HDU6400 Parentheses Matrix
  详细解决方案

【构造】HDU6400 Parentheses Matrix

热度:140   发布时间:2023-09-27 06:38:24.0

分析:

很有趣的一道题目啊。。。

毕竟是构造题,没什么思路可言,这里直接给出两种构造方式:
当然,首先排除掉nn m 为奇数的情况,

对于n、m都为偶数的情况:
11、
【构造】HDU6400 Parentheses Matrix
这里只讨论n>mn>m的情况(如果m>nm>n把矩形横过来看即可)
第一列全为”(“,最后一列全为”)”
中间按照行和列的奇偶性

这么放的答案为n+(m?2)2n+(m?2)2

22、
【构造】HDU6400 Parentheses Matrix

第一行与第一列全为“(”,最后一行与最后一列全为“)”(相交的位置任意放)

中间还是按照行和列的奇偶性放

这么放的答案为n+m?4n+m?4

min{ n,m}4min{n,m}≤4时,使用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("(");elsePF(")");}PF("\n");}}
}
  相关解决方案