您的位置:首页 > 其它

NYOJ92 图像有用区域 【BFS】

2014-06-13 19:34 288 查看

碰到了一个以前从未见过的奇怪问题:先上截图:

运行号用户题目结果时间内存语言提交时间
895360长木图像有用区域
Accepted
5085724C/C++06-13 19:26:41
895352长木图像有用区域MemoryLimitExceeded----C/C++06-13 18:24:34
895351长木图像有用区域MemoryLimitExceeded----C/C++06-13 18:23:05
895348长木图像有用区域MemoryLimitExceeded----C/C++06-13 18:19:59
895347长木图像有用区域MemoryLimitExceeded----C/C++06-13 18:14:47
895345长木图像有用区域MemoryLimitExceeded----C/C++06-13 18:08:41
895342长木图像有用区域MemoryLimitExceeded----C/C++06-13 18:00:17

内存限制是65兆,修改之前超了6次,修改之后却只占5兆内存,真是奇了怪了。修改的地方仅仅是在入队之前把像素点给标注为0...教训是修改后再入队列..原因应该是好些已经入队的点重复入队了。


图像有用区域

时间限制: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


AC代码:

//在外面加一圈非0,再广搜
#include <cstdio>
#include <queue>
using std::queue;
int t, w, h, arr[962][1442];
int mov[][2] = {-1, 0, 0, 1, 1, 0, 0, -1};
queue<int> Q;

bool check(int x, int y){
if(x < 0 || y < 0 || x > h + 1 || y > w + 1)
return 0;
if(!arr[x][y]) return 0;
return 1;
}

void BFS(){
int x, y, a, b;
Q.push(0); Q.push(0);
arr[0][0] = 0;
while(!Q.empty()){
x = Q.front(); Q.pop();
y = Q.front(); Q.pop();
for(int i = 0; i < 4; ++i){
a = x + mov[i][0];
b = y + mov[i][1];
if(check(a, b)){
arr[a][b] = 0;
Q.push(a); Q.push(b);
}
}
}
}

int main(){
scanf("%d", &t);
while(t--){
scanf("%d%d", &w, &h);
for(int i = 0; i <= w + 1; ++i){
arr[0][i] = 1;
arr[h+1][i] = 1;
}

for(int i = 1; i <= h; ++i){
arr[i][0] = 1;
for(int j = 1; j <= w; ++j)
scanf("%d", &arr[i][j]);
arr[i][w+1] = 1;
}
BFS();
for(int i = 1; i <= h; ++i){
for(int j = 1; j <= w; ++j){
if(j != w) printf("%d ", arr[i][j]);
else printf("%d\n", arr[i][j]);
}
}
}
return 0;
}


MLE代码:

#include <cstdio>
#include <queue>
using std::queue;
int t, w, h, arr[962][1442];
int mov[][2] = {-1, 0, 0, 1, 1, 0, 0, -1};
queue<int> Q;

bool check(int x, int y){
if(x < 0 || y < 0 || x > h + 1 || y > w + 1)
return 0;
if(!arr[x][y]) return 0;
return 1;
}

void BFS(){
int x, y;
Q.push(0); Q.push(0);
while(!Q.empty()){
x = Q.front(); Q.pop();
y = Q.front(); Q.pop();
arr[x][y] = 0;  //仅仅是这里不同
for(int i = 0; i < 4; ++i){
if(check(x + mov[i][0], y + mov[i][1])){
Q.push(x + mov[i][0]);
Q.push(y + mov[i][1]);
}
}
}
}

int main(){
scanf("%d", &t);
while(t--){
while(!Q.empty()) Q.pop();
scanf("%d%d", &w, &h);
for(int i = 0; i <= w + 1; ++i){
arr[0][i] = 1;
arr[h+1][i] = 1;
}

for(int i = 1; i <= h; ++i){
arr[i][0] = 1;
for(int j = 1; j <= w; ++j)
scanf("%d", &arr[i][j]);
arr[i][w+1] = 1;
}
BFS();
for(int i = 1; i <= h; ++i){
for(int j = 1; j <= w; ++j){
if(j != w) printf("%d ", arr[i][j]);
else printf("%d\n", arr[i][j]);
}
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  NYOJ92