题目点我
边界外加一圈从这一圈上某一点开始广搜,可以不漏掉每个边界上的像素。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <queue>
using namespace std;
#define maxw 1500
#define maxh 1000
int map[maxh][maxw];
int w, h;
int dir[4][2] = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};
void bfs(int x, int y){
queue<int> Q;
int i, xx, yy, nx, ny;
Q.push(x);
Q.push(y);
while(!Q.empty()){
nx = Q.front();
Q.pop();
ny = Q.front();
Q.pop();
for(i = 0; i < 4; i++){
xx = nx + dir[i][0];
yy = ny + dir[i][1];
if((map[yy][xx] != 0) && (xx <= w + 1) && (xx >= 0) && (yy <= h + 1) && (yy >= 0)){
map[yy][xx] = 0;
Q.push(xx);
Q.push(yy);
}
}
}
return;
}
int main(){
int cases, i, j;
scanf("%d", &cases);
while(cases--){
scanf("%d %d", &w, &h);
memset(map, -1, sizeof(map));
for(i = 1; i <= h; i++){
for(j = 1; j <= w; j++)
scanf("%d", &map[i][j]);
}
bfs(0, 0);
for(i = 1; i <= h; i++){
for(j = 1; j <= w; j++){
printf("%d", map[i][j]);
if(j != w) printf(" ");
}
printf("\n");
}
}
return 0;
}