思路
可以先暴力打表(dfs)找规律。很多与矩阵有关的题都是可以先打表来找规律的(dls最开始就是这么干的,虽然最后失败了qaq),记得之前牛客多校上的一道无限矩阵的题最后就是用dfs打表才找到了规律...
此题主要分为3种情况(m,n为矩阵的h和w):
1.m,n皆为奇,矩阵的goodness值永远为1,只需全部用(输出即可
2.m,n为一奇一偶,矩阵的goodness为偶数边的值,稍微分类讨论一下即可。
3.m,n皆为偶,也是最复杂的一种情况。分为三种小情况:m,n的最小值为2;m,n的最小值为4;m,n为剩余情况。 (1)m,n当中有2,可以参照上一种情况做。 (2)m,n当中有4,需要单独来讨论 (3)m,n最小值大于4,可以通过这两个例子发现规律: m=6,n=6时: m=8,n=8时:
自己WA的原因: 1.m,n都为偶时,其最小值==4的情况要单独拿出来分析! 2. 在上个情况时,没有注意到())( 这种矩阵的goodness值是为1的
附上代码:
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
using namespace std;
#define rep(i,a,n) for(int i=a;i<n;i++)
int main(){int T;scanf("%d",&T);while(T--){int m,n;scanf("%d%d",&m,&n);d=n;if(m%2==1&&n%2==1){for(int i=0;i<m;i++){for(int j=0;j<n;j++)printf("(");printf("\n");}}else if(m%2==1&&n%2==0){for(int i=0;i<m;i++){for(int j=0;j<n;j++){if(j%2==0)printf("(");elseprintf(")");}printf("\n");}}else if(m%2==0&&n%2==1){for(int i=0;i<m;i++){if(i%2==0)for(int j=0;j<n;j++)printf("(");elsefor(int j=0;j<n;j++)printf(")");printf("\n");}}else{if(m==2||n==2){if(m>n){for(int i=0;i<m;i++){for(int j=0;j<n;j++){if(j%2==0)printf("(");elseprintf(")");}printf("\n");}}else{for(int i=0;i<m;i++){if(i%2==0)for(int j=0;j<n;j++)printf("(");elsefor(int j=0;j<n;j++)printf(")");printf("\n");}}continue;}else if(m==4||n==4){int f[210][210];swap(m,n);int p=min(m,n),q=max(m,n);if(p<=4){rep(i,0,p){rep(j,0,q/2) f[i][j]=i&1;rep(j,0,q/2) f[i][j+q/2]=(i&1)^(i!=0&&i!=p-1);}if(n<m){rep(i,0,n){rep(j,0,m) putchar(f[i][j]?')':'(');puts("");}}else{rep(i,0,n){rep(j,0,m) putchar(f[j][i]?')':'(');puts("");}}}continue;}for(int i=0;i<m;i++){if(i==0){for(int j=0;j<n;j++)printf("(");printf("\n");}else if(i==m-1){for(int j=0;j<n;j++)printf(")");printf("\n");}else if(i%2==1){for(int j=0;j<n;j++){if(j%2==0)printf("(");elseprintf(")");}printf("\n");}else if(i%2==0){for(int j=0;j<n;j++){if(j==0)printf("(");else if(j==n-1)printf(")");else if(j%2==1)printf("(");elseprintf(")");}printf("\n");}}}}return 0;
}