运行号 | 用户 | 题目 | 结果 | 时间 | 内存 | 语言 | 提交时间 |
---|---|---|---|---|---|---|---|
895360 | 长木 | 图像有用区域 | Accepted | 508 | 5724 | C/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 |
“ACKing”同学以前做一个图像处理的项目时,遇到了一个问题,他需要摘取出图片中某个黑色线圏成的区域以内的图片,现在请你来帮助他完成第一步,把黑色线圏外的区域全部变为黑色。
图1 图2
已知黑线各处不会出现交叉(如图2),并且,除了黑线上的点外,图像中没有纯黑色(即像素为0的点)。
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
//在外面加一圈非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; }
#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 图像有用区域 【BFS】,布布扣,bubuko.com
原文:http://blog.csdn.net/chang_mu/article/details/30516737