皮卡丘的妹妹 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 r语言神经网络自变量重要性分析
  • ¥15 基于双目测规则物体尺寸
  • ¥15 wegame打不开英雄联盟
  • ¥15 公司的电脑,win10系统自带远程协助,访问家里个人电脑,提示出现内部错误,各种常规的设置都已经尝试,感觉公司对此功能进行了限制(我们是集团公司)
  • ¥15 救!ENVI5.6深度学习初始化模型报错怎么办?
  • ¥30 eclipse开启服务后,网页无法打开
  • ¥30 雷达辐射源信号参考模型
  • ¥15 html+css+js如何实现这样子的效果?
  • ¥15 STM32单片机自主设计
  • ¥15 如何在node.js中或者java中给wav格式的音频编码成sil格式呢