图像处理(YOJ2.0中的题)

题目如上(至于YOJ2.0,那是我学校的做题网站)

先说一下感受吧:真的是爽死了,不过因为有提前打草稿(电纸书神!),所以中间的思路完全没出错,有什么错的话,也只有在输入上有问题。写了一个小时多,真的爽,希望以后能秒了

因为我有写注释,就不写解题思路了,核心就是一开始设置的两个数组,一个记录各点的数据,另一个记录坏点坐标(实际上你看名称也可以看得懂)

代码如下:

#include<stdio.h>
#include<math.h>

int main(void)
{
    int m, n;
    scanf("%d%d", &n, &m);
    int data[n][m][4];//三个记数据,一个是否
    int dead_pixel[m * n][3];//两个记坐标,一个是否
    int num_of_dead_pixel = 0;

    //对数据预处理
    for(int i = 0; i < n; i++)
    {
        for(int j = 0; j < m; j++)
        {
            //输入
            getchar();
            getchar();
            scanf("%d", &data[i][j][0]);
            getchar();
            getchar();
            getchar();
            scanf("%d", &data[i][j][1]);
            getchar();
            getchar();
            getchar();
            scanf("%d", &data[i][j][2]);
            getchar();
            //处理
            if(data[i][j][0] + data[i][j][1] + data[i][j][2] == 0)
            {
                data[i][j][3] = 1;
                dead_pixel[num_of_dead_pixel][0] = i;
                dead_pixel[num_of_dead_pixel][1] = j;
                dead_pixel[num_of_dead_pixel][2] = 1;
                num_of_dead_pixel++;
            }
            else
                data[i][j][3] = 0;
        }
    }
    
    //开始修复
    int num = num_of_dead_pixel;
    while(num)
    {
        for(int i = 0; i < num_of_dead_pixel; i++)
        {
            if(dead_pixel[i][2])
            {
                //相加
                int all_R = 0, all_G = 0, all_B = 0;//计算上下左右的总和
                double num_tmp = 0.0;//用来记录加了多少次
                if(dead_pixel[i][0] != 0)//上
                    if(data[dead_pixel[i][0] - 1][dead_pixel[i][1]][3] != 1)
                    {
                        all_R += data[dead_pixel[i][0] - 1][dead_pixel[i][1]][0];
                        all_G += data[dead_pixel[i][0] - 1][dead_pixel[i][1]][1];
                        all_B += data[dead_pixel[i][0] - 1][dead_pixel[i][1]][2];
                        num_tmp += 1.0;
                    }
                if(dead_pixel[i][0] != n - 1)//下
                    if(data[dead_pixel[i][0] + 1][dead_pixel[i][1]][3] != 1)
                    {
                        all_R += data[dead_pixel[i][0] + 1][dead_pixel[i][1]][0];
                        all_G += data[dead_pixel[i][0] + 1][dead_pixel[i][1]][1];
                        all_B += data[dead_pixel[i][0] + 1][dead_pixel[i][1]][2];
                        num_tmp += 1.0;
                    }
                if(dead_pixel[i][1] != 0)//左
                    if(data[dead_pixel[i][0]][dead_pixel[i][1] - 1][3] != 1)
                    {
                        all_R += data[dead_pixel[i][0]][dead_pixel[i][1] - 1][0];
                        all_G += data[dead_pixel[i][0]][dead_pixel[i][1] - 1][1];
                        all_B += data[dead_pixel[i][0]][dead_pixel[i][1] - 1][2];
                        num_tmp += 1.0;
                    }
                if(dead_pixel[i][1] != m - 1)//右
                    if(data[dead_pixel[i][0]][dead_pixel[i][1] + 1][3] != 1)
                    {
                        all_R += data[dead_pixel[i][0]][dead_pixel[i][1] + 1][0];
                        all_G += data[dead_pixel[i][0]][dead_pixel[i][1] + 1][1];
                        all_B += data[dead_pixel[i][0]][dead_pixel[i][1] + 1][2];
                        num_tmp += 1.0;
                    }
                //赋值修复
                if(num_tmp == 0.0)//代表上下左右为坏点,等于没修
                    continue;
                else
                {
                    data[dead_pixel[i][0]][dead_pixel[i][1]][0] = (int)(ceil((double)all_R / num_tmp));
                    data[dead_pixel[i][0]][dead_pixel[i][1]][1] = (int)(ceil((double)all_G / num_tmp));
                    data[dead_pixel[i][0]][dead_pixel[i][1]][2] = (int)(ceil((double)all_B / num_tmp));
                }

                dead_pixel[i][2] = 2;//2代表这轮是坏点
                num--;
            }
        }
        //使这轮修复的不再是坏点
        for(int i = 0; i < num_of_dead_pixel; i++)
            if(dead_pixel[i][2] == 2)
            {
                dead_pixel[i][2] = 0;
                data[dead_pixel[i][0]][dead_pixel[i][1]][3] = 0;
            }
    }

    //输出
    for(int i = 0; i < n; i++)
    {
        for(int j = 0; j < m; j++)
        {
            printf("R %d G %d B %d", data[i][j][0], data[i][j][1], data[i][j][2]);
            if(j < m - 1)
                putchar(' ');
        }
        if(i < n - 1)
            putchar('\n');
    }

    return 0;
}

虽然英文名称可以让我们一看就懂,但是太长了搞得我有点头晕,以后试试缩写吧

最后就得了90分,有一个数据超时了(爽死了)

明天要去调研(双学位的苦),找个时间给代码优化一下

补充:调研完回来看代码了,感觉已经是最简的版本了,所以根本想不出其他的办法,最后发现是可以看范例的输入和输出,然后发现:居然还有全都是坏点根本修不了的情况,最后简单改了一下代码(就加了个判断语句),得了个100

#include<stdio.h>
#include<math.h>

int main(void)
{
    int m, n;
    scanf("%d%d", &n, &m);
    int data[n][m][4];//三个记数据,一个是否
    int dead_pixel[m * n][3];//两个记坐标,一个是否
    int num_of_dead_pixel = 0;

    //对数据预处理
    for(int i = 0; i < n; i++)
    {
        for(int j = 0; j < m; j++)
        {
            //输入
            getchar();
            getchar();
            scanf("%d", &data[i][j][0]);
            getchar();
            getchar();
            getchar();
            scanf("%d", &data[i][j][1]);
            getchar();
            getchar();
            getchar();
            scanf("%d", &data[i][j][2]);
            getchar();
            //处理
            if(data[i][j][0] + data[i][j][1] + data[i][j][2] == 0)
            {
                data[i][j][3] = 1;
                dead_pixel[num_of_dead_pixel][0] = i;
                dead_pixel[num_of_dead_pixel][1] = j;
                dead_pixel[num_of_dead_pixel][2] = 1;
                num_of_dead_pixel++;
            }
            else
                data[i][j][3] = 0;
        }
    }
    
    //开始修复
    if(num_of_dead_pixel != m * n)
    {
        int num = num_of_dead_pixel;
        while(num)
        {
            for(int i = 0; i < num_of_dead_pixel; i++)
            {
                if(dead_pixel[i][2])
                {
                    //相加
                    int all_R = 0, all_G = 0, all_B = 0;//计算上下左右的总和
                    double num_tmp = 0.0;//用来记录加了多少次
                    if(dead_pixel[i][0] != 0)//上
                        if(data[dead_pixel[i][0] - 1][dead_pixel[i][1]][3] != 1)
                        {
                            all_R += data[dead_pixel[i][0] - 1][dead_pixel[i][1]][0];
                            all_G += data[dead_pixel[i][0] - 1][dead_pixel[i][1]][1];
                            all_B += data[dead_pixel[i][0] - 1][dead_pixel[i][1]][2];
                            num_tmp += 1.0;
                        }
                    if(dead_pixel[i][0] != n - 1)//下
                        if(data[dead_pixel[i][0] + 1][dead_pixel[i][1]][3] != 1)
                        {
                            all_R += data[dead_pixel[i][0] + 1][dead_pixel[i][1]][0];
                            all_G += data[dead_pixel[i][0] + 1][dead_pixel[i][1]][1];
                            all_B += data[dead_pixel[i][0] + 1][dead_pixel[i][1]][2];
                            num_tmp += 1.0;
                        }
                    if(dead_pixel[i][1] != 0)//左
                        if(data[dead_pixel[i][0]][dead_pixel[i][1] - 1][3] != 1)
                        {
                            all_R += data[dead_pixel[i][0]][dead_pixel[i][1] - 1][0];
                            all_G += data[dead_pixel[i][0]][dead_pixel[i][1] - 1][1];
                            all_B += data[dead_pixel[i][0]][dead_pixel[i][1] - 1][2];
                            num_tmp += 1.0;
                        }
                    if(dead_pixel[i][1] != m - 1)//右
                        if(data[dead_pixel[i][0]][dead_pixel[i][1] + 1][3] != 1)
                        {
                            all_R += data[dead_pixel[i][0]][dead_pixel[i][1] + 1][0];
                            all_G += data[dead_pixel[i][0]][dead_pixel[i][1] + 1][1];
                            all_B += data[dead_pixel[i][0]][dead_pixel[i][1] + 1][2];
                            num_tmp += 1.0;
                        }
                    //赋值修复
                    if(num_tmp == 0.0)//代表上下左右为坏点,等于没修
                        continue;
                    else
                    {
                        data[dead_pixel[i][0]][dead_pixel[i][1]][0] = (int)(ceil((double)all_R / num_tmp));
                        data[dead_pixel[i][0]][dead_pixel[i][1]][1] = (int)(ceil((double)all_G / num_tmp));
                        data[dead_pixel[i][0]][dead_pixel[i][1]][2] = (int)(ceil((double)all_B / num_tmp));
                    }

                    dead_pixel[i][2] = 2;//2代表这轮是坏点
                    num--;
                }
            }
            //使这轮修复的不再是坏点
            for(int i = 0; i < num_of_dead_pixel; i++)
                if(dead_pixel[i][2] == 2)
                {
                    dead_pixel[i][2] = 0;
                    data[dead_pixel[i][0]][dead_pixel[i][1]][3] = 0;
                }
        }
    }

    //输出
    for(int i = 0; i < n; i++)
    {
        for(int j = 0; j < m; j++)
        {
            printf("R %d G %d B %d", data[i][j][0], data[i][j][1], data[i][j][2]);
            if(j < m - 1)
                putchar(' ');
        }
        if(i < n - 1)
            putchar('\n');
    }

    return 0;
}

哭死

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值