2018 Multi-University Training Contest 8 HDU6400 Parentheses Matrix

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhlbjtu2016/article/details/81748595

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6400

题意:给出n,m 。构造出一个行、列符合括号匹配最大的数的矩阵

分析:

n,m均为奇数,结果为0个

n,m有一个为奇数,结果为那个奇数

n,m均为偶数

一般情况构造如下:舍弃第一行和最后一行,满足尽可能多的列,舍弃第一列和最后一列,满足尽可能多的行,可以得到这种情况为n+m-4个

.((((.
()()()
(()())
()()()
(()())
()()()
(()())
.)))).

但是在n,m较小的特殊情况需要特判一下,比如n = 4,m = 4,按照上面的构造虽然舍弃了两列,但是只增加了两个行,但是如下构造可以增加两个列和一半的行,结果为m + n / 2 - 1(m > n,n > m同理)

((((
(())
))((
))))

m + n / 2 - 1 = n + m - 4 =>n = 6  n < 6时选第二种,反之选第一种

代码:

#include<bits/stdc++.h>
using namespace std;
char res[210][210];
void solve(int n,int m)
{

    if(n % 2 != 0 && m % 2 != 0)
    {
        for(int j = 1; j <= n; j++)
        {
            for(int k = 1; k <= m; k++)
                res[j][k] = '(';
        }
    }
    else if(n % 2 != 0 || m % 2 != 0)
    {
        if(n % 2 != 0)
        {
            for(int j = 1; j <= n; j++)
            {
                for(int k = 1; k <= m; k++)
                {
                    if(k <= m / 2)
                        res[j][k] = '(';
                    else
                        res[j][k] = ')';
                }
            }
        }
        else
        {
            for(int j = 1; j <= m; j++)
            {
                for(int k = 1; k <= n; k++)
                {
                    if(k <= n / 2)
                        res[k][j] = '(';
                    else
                        res[k][j] = ')';
                }
            }
        }
    }
    else
    {
        if(min(n,m) < 6)
        {
            if(n <= m)
            {
                for(int j = 1; j <= n; j++)
                {
                    for(int k = 1; k <= m; k++)
                    {
                        if(j == 1)res[j][k] = '(';
                        else if(j == n)res[j][k] = ')';
                        else
                        {
                            if(j <= n / 2)
                            {
                                if(k <= m / 2)
                                {
                                    res[j][k] = '(';
                                }
                                else
                                {
                                    res[j][k] = ')';
                                }
                            }
                            else
                            {
                                if(k <= m / 2)
                                    res[j][k] = ')';
                                else
                                    res[j][k] = '(';
                            }
                        }
                    }
                }
            }
            else
            {
                for(int j = 1; j <= m; j++)
                {
                    for(int i = 1; i <= n; i++)
                    {
                        if(j == 1)res[i][j] = '(';
                        else if(j == m)res[i][j] = ')';
                        else
                        {
                            if(i <= n / 2)
                            {
                                if(j <= m / 2)
                                {
                                    res[i][j] = '(';
                                }
                                else
                                {
                                    res[i][j] = ')';
                                }
                            }
                            else
                            {
                                if(j <= m / 2)
                                {
                                    res[i][j] = ')';
                                }
                                else
                                {
                                    res[i][j] = '(';
                                }
                            }
                        }
                    }
                }
            }

        }
        else
        {
            for(int i = 1; i <= n; i++)
            {
                for(int j = 1; j <= m; j++)
                {
                    if(j == 1 || i == 1)res[i][j] = '(';
                    else if(j == m || i == n)res[i][j] = ')';
                    else
                    {
                        if(i % 2 == 0)
                        {
                            if(j % 2)res[i][j] = '(';
                            else res[i][j] = ')';
                        }
                        else
                        {
                            if(j % 2)res[i][j] = ')';
                            else res[i][j] = '(';
                        }
                    }
                }
            }
        }
    }

}
int main()
{

    int t;
    cin>>t;
    for(int i = 1; i <= t; i++)
    {
        int n,m;
        scanf("%d%d",&n,&m);


        solve(n,m);
        for(int i = 1; i <= n; i++)
        {
            for(int j = 1; j <= m; j++)
                printf("%c",res[i][j]);
            printf("\n");
        }
    }


    return 0;
}

猜你喜欢

转载自blog.csdn.net/zhlbjtu2016/article/details/81748595
今日推荐