zoukankan      html  css  js  c++  java
  • 南阳oj92--图像有用区域(Bfs)

    图像有用区域

    时间限制: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表示白色)
    输出
    以矩阵形式输出把黑色框之外的区域变黑之后的图像中各点的像素值。
    样例输入
    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 <queue>
    #include <cstdio>
    #include <cstring>
    #include <iostream>
    using namespace std;
    int map[961][1441], ac[4][2] = {010, -1, -1010};
    int n, m;
    struct Pic
    {
        int x, y;
    } r, s, t;
    void Bfs(int a, int b)
    {
        r.x = a; r.y = b;
        queue<Pic> Q;
        Q.push(r);
        while(!Q.empty()) 
        {
            s = Q.front(); Q.pop();
            for(int i = 0; i < 4; i++)
            {
                t.x = s.x + ac[i][0];
                t.y = s.y + ac[i][1];
                if(t.x >= 0 && t.x <= n+1 && t.y >= 0 && t.y <= m+1 && map[t.x][t.y] != 0)
                {
                    map[t.x][t.y] = 0;
                    Q.push(t);
                }    
            }    
        }
    }
    int main()
    {
        int T;
        scanf("%d", &T);
        while(T--)
        {
            scanf("%d %d", &m, &n);
            memset(map, 1sizeof(map));    //边框: 
            for(int i = 1; i <= n; i++)            
                for(int j = 1; j <= m; j++)
                    scanf("%d", &map[i][j]);
            Bfs(00);
            for(int i = 1; i <= n; i++)
                for(int j = 1; j <= m; j++)
                    printf(j==m? "%d ":"%d ", map[i][j]); 
        }
        return 0;    
  • 相关阅读:
    Asp.net开发必备51种代码
    防止页面被多次提交
    c#发送邮件.net1.1和.net2.0中的两个方法
    鼠标移至小图,自动显示相应大图
    NET(C#)连接各类数据库集锦
    在C#中对XML的操作
    Window.ShowModalDialog使用总结
    SQLServer2005 添加用户,及操作权限
    定时器
    Global.asax.cs中的方法的含义
  • 原文地址:https://www.cnblogs.com/soTired/p/4780304.html
Copyright © 2011-2022 走看看