• ACM 图像有用区域


    图像有用区域

    时间限制:3000 ms  |  内存限制:65535 KB
    难度:4
     
    描述

    “ACKing”同学以前做一个图像处理的项目时,遇到了一个问题,他需要摘取出图片中某个黑色线圏成的区域以内的图片,现在请你来帮助他完成第一步,把黑色线圏外的区域全部变为黑色。

         

                    图1                                                        图2 

    已知黑线各处不会出现交叉(如图2),并且,除了黑线上的点外,图像中没有纯黑色(即像素为0的点)。

     
    输入
    第一行输入测试数据的组数N(0<N<=6)
    每组测试数据的第一行是两个个整数W,H分表表示图片的宽度和高度(3<=W<=1440,3<=H<=960)
    随后的H行,每行有W个正整数,表示该点的像素值。(像素值都在0到255之间,0表示黑色,255表示白色)
    输出
    以矩阵形式输出把黑色框之外的区域变黑之后的图像中各点的像素值。
    样例输入
    1
    5 5
    100 253 214 146 120
    123 0 0 0 0
    54 0 33 47 0
    255 0 0 78 0
    14 11 0 0 0
    
    样例输出
    0 0 0 0 0
    0 0 0 0 0
    0 0 33 47 0
    0 0 0 78 0
    0 0 0 0 0


    不知道为何提交程序测试会出错,没找到错误。。
    #include <stdio.h>
    #include <stdlib.h>
    int main()
    {
        int N = 0, W = 0, H = 0, i = 0, j = 0, k = 0, l = 0;
        scanf("%d", &N);
        while(N--)
        {
            scanf("%d%d", &W, &H);
            int** a = (int**)malloc(sizeof(int*) * H);
            i = H;
            while(i--)
            {
                a[i] = (int*)malloc(sizeof(int) * W);
            }
    
            i = 0;
            while(i < H)
            {
                j = 0;
                while(j < W)
                {
                    scanf("%d", &a[i][j]);
                    j++;
                }
                i++;
            }
    
            i = 0;
            while(i < H)
            {
                int flagJ = 0;
                int flagK = 0;
                j = 0;
                k = W-1;
                while(k - j > -1)
                {
                    if(a[i][j] == 0 && flagJ == 0)
                        flagJ = 1;
                    if(flagJ == 0)
                        a[i][j] = -1;
    
                    if(a[i][k] == 0 && flagK == 0)
                        flagK = 1;
                    if(flagK == 0)
                        a[i][k] = -1;
                    j++;
                    k--;
                }
                i++;
            }
    
            i = 0;
            while(i < W)
            {
                int flagJ = 0;
                int flagK = 0;
                j = 0;
                k = H-1;
                while(k - j > -1)
                {
                    if(a[j][i] == 0 && flagJ == 0)
                        flagJ = 1;
                    if(flagJ == 0 || a[j][i] == -1)
                        a[j][i] = 0;
    
                    if(a[k][i] == 0 && flagK == 0)
                        flagK = 1;
                    if(flagK == 0 || a[k][i] == -1)
                        a[k][i] = 0;
                    j++;
                    k--;
                }
                i++;
            }
    
            i = 0;
            while(i < H)
            {
                j = 0;
                while(j < W)
                {
                    printf("%d ", a[i][j]);
                    j++;
                }
                printf("
    ");
                i++;
            }
        }
        return 1;
    }
  • 相关阅读:
    C语言不进行类型检查 和函数能够不进行前向声明
    EventBus 《二》 Android EventBus的简单使用
    android开发之SnackBar的使用
    iOS语音播放之切换听筒和扬声器
    使用NSURLConnection的网络请求与封装
    Mina Basics 02-基础
    Mina Basics 02-基础
    jquery移除事件,绑定事件,触发事件
    jquery移除事件,绑定事件,触发事件
    jquery移除事件,绑定事件,触发事件
  • 原文地址:https://www.cnblogs.com/sdlwlxf/p/4553005.html
Copyright © 2020-2023  润新知