皮卡丘的妹妹 2022-04-26 17:02 采纳率: 57.1%
浏览 56
已结题

洛谷 涂国旗 请问我的代码还需要完善什么

代码过不了oj,有四个数据错误
某国法律规定,只要一个由N×M 个小方块组成的旗帜符合如下规则,就是合法的国旗:

(1)从最上方若干行(至少一行)的格子全部是白色的;

(2)接下来若干行(至少一行)的格子全部是蓝色的;

(3)剩下的行(至少一行)全部是红色的;

现有一个棋盘状的布,分成了N行M列的格子,每个格子是白色蓝色红色之一,小民希望把这个布改成该国国旗,方法是在一些格子上涂颜料,盖住之前的颜色。小民很懒,希望涂最少的格子,使这块布成为一个合法的国旗。

【输入形式】

第一行是两个整数 N,M。

接下来是 N×M一个矩阵,矩阵的每一个小方块是W(白),B(蓝),R(红)中的一个。

【输出形式】

一个整数,表示至少需要涂多少块。

【样例输入】

4 5

WRWRW

BWRWB

WRWRW

RWBWR

【样例输出】

11

【数据范围】

对于100% 的数据,N,M≤50。

#include<bits/stdc++.h>
using namespace std;
int n,m;int i,j;
int W[100],B[100],R[100];
string str[100];
int main()
{
cin >> n >> m;
for(i = 1;i<=n;i++)
{
cin >> str[i];
for(j = 1;j<=m;j++)
{
if(str[i][j] != 'R')
R[i]++;
if(str[i][j] != 'W')
W[i]++;
if(str[i][j] != 'B')
B[i]++;

    }
    
}
    W[i]=W[i-1];
    B[i]=B[i-1];
    R[i]=R[i-1];
    int count = 0;
    for(i = 1;i <= n-2;i++)
    {
        for(j = i+1;j <=n-2;j++)
        {
            count =R[i]+W[i]+B[i];
        }
    }
    cout << count;
    return 0;

}
//设第 1 行到第 i 行是白色

//第 i + 1 行到第 j 行是蓝色

//则第 j + 1行到第 n 行是红色

  • 写回答

3条回答 默认 最新

  • 关注

    你下面写的注释写的逻辑是对的,但是代码的逻辑是错误的。
    先贴运行结果:

    img


    解题思路:
    题目首先需要保证第1行是白色、最后一行是红色,然后假设在s行变成蓝色,在t行开始变成红色,然后双重for循环遍历,计算最小值就可以了。
    代码修改如下:

    #include<bits/stdc++.h>
    //#include <iostream>
    using namespace std;
    int n, m; int i, j;
    string str[50];
    int main()
    {
        cin >> n >> m;
        for (i = 0; i < n; i++)
        {
            cin >> str[i];
        }
        
        int count = 0;
        
        for (j = 0; j < m; j++)
        {
            //保证第一行必须全部是白色
            if (str[0][j] != 'W')
                count++;
            //保证最后一行必须全部是红色
            if (str[n - 1][j] != 'R')
                count++;
        }
        //查找中间的怎么处理是修改次数最少的情况
        int tmp=0, min = -1;
        //假设在第s行开始变成蓝色,在第t行变成红色
        int s = 1, t = 1;
        for (s = 1; s < n - 1; s++)
        {
            for (t = s + 1; t < n - 1; t++)
            {
                tmp = 0;
                //计算从1到s-1行需要改变的颜色,从其它颜色改变为白色
                for (int x = 1; x < s; x++)
                {
                    for (int y = 0; y < m; y++)
                    {
                        if (str[x][y] != 'W')
                            tmp++;
                    }
                }
                //计算从s到t-1行需要改变的颜色,从其它颜色改变为蓝色
                for (int x = s; x < t; x++)
                {
                    for (int y = 0; y < m; y++)
                    {
                        if (str[x][y] != 'B')
                            tmp++;
                    }
                }
    
                //计算从t行到n-1行需要改变的颜色,从其它颜色改变为红色
                for (int x = t; x < n - 1; x++)
                {
                    for (int y = 0; y < m; y++)
                    {
                        if (str[x][y] != 'R')
                            tmp++;
                    }
                }
                //比较得到最小值
                if (min == -1)
                    min = tmp;
                else if (tmp < min)
                    min = tmp;
            }
        }
        
        cout << count+min;
        return 0;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 5月13日
  • 已采纳回答 5月5日
  • 修改了问题 4月26日
  • 创建了问题 4月26日

悬赏问题

  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度
  • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测
  • ¥15 ETLCloud 处理json多层级问题
  • ¥15 matlab中使用gurobi时报错
  • ¥15 这个主板怎么能扩出一两个sata口
  • ¥15 不是,这到底错哪儿了😭
  • ¥15 2020长安杯与连接网探
  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么