zoukankan      html  css  js  c++  java
  • 36-图像有用区(dfs, bfs)

    http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=92

                            图像有用区域

    时间限制: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
    来源
    [张云聪]原创
    上传者
    张云聪
    开始用的dfs,爆栈了:
    #include <bits/stdc++.h>
    using namespace std;
    int mp[1500][1500];
    int dx[4] = {1, -1, 0, 0};
    int dy[4] = {0, 0, 1, -1};
    int h, w;
    
    void dfs(int x, int y){
    	mp[x][y] = 0;
    	for(int i = 0; i < 4; i++){
    		int xx = x + dx[i];
    		int yy = y + dy[i];
    		if(xx >= 0 && xx < w && yy >= 0 && yy < h)
    			if(mp[xx][yy]){
    				dfs(xx, yy);
    			} 
    	} 
    }
    
    int main(){
    	int n;
    	cin >> n;
    	while(n--){
    		cin >> h >> w;
    		for(int i = 0; i < w; i++){
    			for(int j = 0; j < h; j++){
    				cin >> mp[i][j];
    			}
    		}
    		for(int i = 0; i < w; i++){  //由外层边界dfs 
    			for(int j = 0; j < h; j++){
    				if((i == 0 || j == 0 || i == w - 1 || j == h - 1) && mp[i][j]){
    					dfs(i, j);
    				}
    			}
    		}
    		for(int i = 0; i < w; i++){
    			cout << mp[i][0];
    			for(int j = 1; j < h; j++){
    				cout << " " << mp[i][j];
    			}
    			cout << endl;
    		}
    	}
    	
    	return 0;
    }         
    

      后面用了广搜ac:

    #include <iostream>
    #include <cstring>
    #include <queue>
    using namespace std;
    struct node{
    	int x, y;
    };
    int mp[1000][1500];
    queue <node> myq;
    int n, m;
    int dx[4] = {0, 0, 1, -1};
    int dy[4] = {1, -1, 0, 0};
    
    void bfs(int x, int y){
    	node a;
    	a.x = x, a.y = y;
    	myq.push(a);
    	mp[a.x][a.y] = 0;
    	while(!myq.empty()){
    		node b;
    		b = myq.front();
    		myq.pop();
    		int myx = b.x, myy = b.y;
    		node c;
    		for(int i = 0; i < 4; i++){
    			int xx = myx + dx[i];
    			int yy = myy + dy[i];
    			if(xx >= 0 && xx <= n + 1 && yy >= 0 && yy <= m + 1){
    				if(mp[xx][yy]){
    					mp[xx][yy] = 0;
    					c.x = xx;
    					c.y = yy;
    					myq.push(c);
    				}
    			}
    		}
    	}
    }
    
    int main(){
    	std::ios::sync_with_stdio(false);
    	int t;
    	cin >> t;
    	while(t--){
    		cin >> m >> n;
    		memset(mp, 1, sizeof(mp));
    		for(int i = 1; i <= n; i++){
    			for(int j = 1; j <= m; j++){
    				cin >> mp[i][j];
    			}
    		}
    		bfs(0, 0);
    		for(int i = 1; i <= n ; i++){
    			cout << mp[i][1];
    			for(int j = 2; j <= m; j++){
    				cout << " " << mp[i][j];
    			}
    			cout << endl;
    		}
    	}
    	return 0;
    }
    

      

  • 相关阅读:
    LeetCode-079-单词搜索
    awk学习笔记
    Python实现排列组合算法
    python模拟登录人人
    Python的SQLite数据库使用方法
    C语言排序算法——插入排序算法
    C语言排序算法——简单选择排序算法
    C语言排序算法——冒泡排序算法
    Python学习——python的函数参数传递
    Python学习——实现secure copy功能
  • 原文地址:https://www.cnblogs.com/zhumengdexiaobai/p/8663230.html
Copyright © 2011-2022 走看看