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;
}

  

原文地址:https://www.cnblogs.com/zhumengdexiaobai/p/8663230.html