hdu6400 矩阵问题

思路

可以先暴力打表(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("(");
                    else
                        printf(")");
                }
                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("(");
                else
                    for(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("(");
                            else
                                printf(")");
                        }
                        printf("\n");
                    }
                }
                else{
                    for(int i=0;i<m;i++){
                        if(i%2==0)
                            for(int j=0;j<n;j++)
                                printf("(");
                        else
                            for(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("(");
                            else
                                printf(")");
                        }
                        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("(");
                            else
                                printf(")");
                        }
                        printf("\n");
                    }
                }

        }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_40038776/article/details/81713362