简化代码量——写优雅代码

今天做了一道比较水的题,但是我依然WA了九次才过,并且在队友的帮助下,找到的了问题的所在,我总结了一下,大概是因为代码量太大了,所以我在写代码的时候经常犯一些错误,这样不仅导致代码量变大,增长A题的时间,最重要的是,导致代码出错的概率大大增加了,并且由于比较大的代码量,导致了代码一旦出错,很难找到其中的错误所在,人为的增加了A题的难度。

今天的这道题目是在一个图里面去寻找一个完整的人,比较朴素的思路,就是对每个点都找到这个点所对应的那一部分,做一个标记,并且输出有多少个这样的部分,从而算出有多少个人

比较好的思路就是整体思考,对于每一个点都作为一个完整的人的左上顶点,这样的话,可以判断对于每一个图,里面有的人的个数,这样也不会重复数数,并且能够找到人的个数,并且能把对于一个小的矩阵的判断单独写一个函数,这样更能够简化代码量

毒兄说,我们要写优雅的代码
我觉得要写优雅的代码就要做到 1.抽象出一个完整的问题,弄清楚所需要的每一部分的具体过程
2、写代码的时候尽量以一个完整的功能来解决问题,简化代码

接下去看一看我们的代码和其他优秀的代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const double PI = acos(-1.0);
const double eps = 1e-6;
const int INF = 0x3f3f3f3f;
const int maxn = 100;
int T,n,m;
char a[105][105];
int vis[105][105];
void solve()
{
    int i,j;
    int cnt=1;
    for(i=1; i<=n; i++)
    {
        for(j=1; j<=m; j++)
        {
            if(a[i][j]!='.'&&vis[i][j]==0)
            {
                vis[i][j]=cnt++;
            }
            switch(a[i][j])
            {
            case 'O':
            {
                if(a[i+1][j]=='|'&&!vis[i+1][j])
                    vis[i+1][j]=vis[i][j];
                if(a[i+1][j+1]=='\\'&&!vis[i+1][j+1])
                    vis[i+1][j+1]=vis[i][j];
                if(a[i+1][j-1]=='/'&&!vis[i+1][j-1])
                    vis[i+1][j-1]=vis[i][j];
                if(a[i+2][j+1]==')'&&!vis[i+2][j+1])
                {
                    vis[i+2][j+1]=vis[i][j];
                }
                if(a[i+2][j-1]=='('&&!vis[i+2][j-1])
                {
                    vis[i+2][j-1]=vis[i][j];
                }
                break;
            }
            case '|':
            {
                if(a[i][j+1]=='\\'&&!vis[i][j+1])
                {
                    vis[i][j+1]=vis[i][j];
                }
                if(a[i+1][j-1]=='('&&!vis[i+1][j-1])
                {
                vis[i+1][j-1]=vis[i][j];
                }
                if(a[i+1][j+1]==')'&&!vis[i+1][j+1])
                {
                    vis[i+1][j+1]=vis[i][j];
                }
                break;
            }
            case '/':
            {
                if(a[i][j+1]=='|'&&!vis[i][j+1])
                {
                    vis[i][j+1]=vis[i][j];
                }
                if(a[i+1][j]=='('&&!vis[i+1][j])
                {
                    vis[i+1][j]=vis[i][j];
                }
                if(a[i][j+2]=='\\'&&!vis[i][j+2])
                {
                    vis[i][j+2]=vis[i][j];
                }
                if(a[i+1][j+2]==')'&&!vis[i+1][j+2])
                {
                    vis[i+1][j+2]=vis[i][j];
                }
                break;
            }

            case '\\':
            {
                if(a[i+1][j]==')'&&!vis[i+1][j])
                {
                    vis[i+1][j]=vis[i][j];
                }
                if(j>2&&a[i+1][j-2]=='('&&!vis[i+1][j-2]){
                    vis[i+1][j-2]=vis[i][j];
                   }
                break;
            }
            case '(':
            {
                if(a[i][j+2]==')'&&!vis[i][j+2])
                {
                    vis[i][j+2]=vis[i][j];
                }
                break;
            }
            }
        }
    }
    printf("%d\n",cnt-1);
}
int main()
{
    cin>>T;
    while(T--)
    {
        memset(vis,0,sizeof(vis));
        cin>>n>>m;
        int i,j;
        for(i=1; i<=n; i++)
        {
            for(j=1; j<=m; j++)
            {
                cin>>a[i][j];
            }
        }
        solve();

    }
    return 0;
}

优秀的代码

#include<queue>
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long LL;
const int maxn = 1e2 + 10;
int T, n, m;
char s[maxn][maxn];

bool check(int x, int y)
{
    if (1 <= x&&x <= n && 1 <= y + 1 && y + 1 <= m&&s[x][y + 1] == 'O') return true;
    if (1 <= x + 1 && x + 1 <= n && 1 <= y && y <= m&&s[x + 1][y] == '/') return true;
    if (1 <= x + 1 && x + 1 <= n && 1 <= y + 1 && y + 1 <= m&&s[x + 1][y + 1] == '|') return true;
    if (1 <= x + 1 && x + 1 <= n && 1 <= y + 2 && y + 2 <= m&&s[x + 1][y + 2] == '\\') return true;
    if (1 <= x + 2 && x + 2 <= n && 1 <= y  && y <= m&&s[x + 2][y] == '(') return true;
    if (1 <= x + 2 && x + 2 <= n && 1 <= y + 2 && y + 2 <= m&&s[x + 2][y + 2] == ')') return true;
    return false;
}

int main()
{
    scanf("%d", &T);
    while (T--)
    {
        scanf("%d%d", &n, &m);
        for (int i = 1; i <= n; i++) scanf("%s", s[i] + 1);
        int ans=0;
        for (int i = -1; i <= n; i++)
        {
            for (int j = -1; j <= m; j++)
            {
                if (check(i, j)) ans++;
            }
        }
        printf("%d\n", ans);
    }
    return 0;
}
全部评论

相关推荐

不讲武德的黑眼圈很能干:接好运
点赞 评论 收藏
分享
冲芭芭拉鸭:你这图还挺新,偷了。
投递美团等公司10个岗位
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务