AICodeThunder 2024-06-10 13:55 采纳率: 22.2%
浏览 2
已结题

(标签-矩阵|关键词-字符串)

请帮我看一下代码哪里有问题
题目描述
A喜欢画雪花。如下定义一个大小为x的雪花:
雪花的中间是一个'+'
在'+'的上方和下方各有x个'|'
在'+'的左方和右方各有x个'-'
在'+'的左上方和右下方各有x个''
在'+'的右上方和左下方各有x个'/'
雪花可以重叠,例如
.|./..
.|/...
--+--..
./|...
/.|.|/
....-+-
..../|
上图有重叠的两个大小分别为2和1的雪花。
给定一个n行m列的字符矩阵,找出其中最大的雪花大小。
输入描述
第一行两个整数n,m
接下来n行每行一个长为m的字符串,表示一个n行m列的字符矩阵
输出描述
一行一个整数表示最大的雪花大小
样例1
输入
5 6
.|/.
---+--
/./|.
./.|.
/..|..
输出
1
样例2
输入
7 7
.|./..
.|/...
--+--..
./|...
/.|.|/
....-+-
..../|
输出
2
提示
数据范围
1<=n,m<=50

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int n, m;
vector<string> a;

int maxS()
{
    int maxs = 0;
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
        {
            if (a[i][j] == '+')
            {
                int s1 = 0;
                for (int k = 0; k < min(i, n-1-i); k++)
                {
                    if (a[i-k][j] == '|' && a[i+k][j] == '|')
                    {
                        s1++;
                    }
                    else
                    {
                        break;
                    }
                }
                if (s1 != 0)
                {
                    maxs = max(maxs, s1);
                }
                else
                {
                    maxs = max(maxs, 1);
                }
                
            }
        }
    }
    return maxs;
}

int main()
{
    cin >> n >> m;
    a.resize(n+1);
    for (int i = 0; i < n; i++)
    {
        cin >> a[i];
    }
    cout << maxS();
    return 0;
}
  • 写回答

2条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-06-10 13:55
    关注

    引自免费微信小程序:皆我百晓生

    从你提供的代码来看,主要的问题在于只检查了竖直方向的|,而没有检查水平方向的-以及斜向的/\。此外,代码中的s1变量仅考虑了|的存在,这不足以确定整个雪花的大小。雪花的完整存在需要同时满足|-/\的正确配置。因此,我们需要修改maxS函数,使其能全面地检查所有条件。

    以下是修改后的代码示例:

    #include <iostream>
    #include <vector>
    #include <algorithm>
    using namespace std;
    
    int n, m;
    vector<string> a;
    
    bool isValid(int x, int y, int size) {
        // Check vertical lines
        for (int i = 1; i <= size; ++i) {
            if (a[x-i][y] != '|' || a[x+i][y] != '|') return false;
        }
    
        // Check horizontal lines
        for (int j = 1; j <= size; ++j) {
            if (a[x][y-j] != '-' || a[x][y+j] != '-') return false;
        }
    
        // Check diagonal lines
        for (int d = 1; d <= size; ++d) {
            if (a[x-d][y-d] != '\\' || a[x+d][y+d] != '\\' || 
                a[x-d][y+d] != '/' || a[x+d][y-d] != '/') return false;
        }
    
        return true;
    }
    
    int maxS()
    {
        int maxs = 0;
        for (int i = 0; i < n; i++)
        {
            for (int j = 0; j < m; j++)
            {
                if (a[i][j] == '+') {
                    for (int size = 1; size <= min(min(i, n-i-1), min(j, m-j-1)); ++size) {
                        if (isValid(i, j, size)) {
                            maxs = max(maxs, size);
                        }
                    }
                }
            }
        }
        return maxs;
    }
    
    int main()
    {
        cin >> n >> m;
        a.resize(n);
        for (int i = 0; i < n; i++) {
            cin >> a[i];
        }
        cout << maxS() << endl;
        return 0;
    }
    

    在这个版本中,我添加了一个isValid辅助函数,用于检查指定位置和大小的雪花是否有效。然后,在maxS函数中,对于每个可能的雪花中心+,我们检查所有可能的大小,直到找到最大的有效雪花大小为止。这样,代码就能正确地识别出最大的雪花尺寸了。

    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 6月10日
  • 修改了问题 6月10日
  • 创建了问题 6月10日

悬赏问题

  • ¥20 WPF MVVM模式 handycontrol 框架, hc:SearchBar 控件 Text="{Binding NavMenusKeyWords}" 绑定取不到值
  • ¥15 需要手写数字信号处理Dsp三个简单题 不用太复杂
  • ¥15 数字信号处理考试111
  • ¥15 allegro17.2生成bom表是空白的
  • ¥15 请问一下怎么打通CAN通讯
  • ¥20 如何在 rocky9.4 部署 CDH6.3.2?
  • ¥35 navicat将excel中的数据导入mysql出错
  • ¥15 rt-thread线程切换的问题
  • ¥15 高通uboot 打印ubi init err 22
  • ¥15 R语言中lasso回归报错