题目链接:https://www.luogu.org/problemnew/show/P1162
题意:
有一个0和1组成的矩阵,一些1组成一个闭合圈,圈住一些0,现在要把被圈住的这些0变成2输出。
思路:
bfs,判断每个0可以到达的边界。
如果这个0是可以到达矩阵的边界的说明没有被圈住。
bfs时不把1加入队列,如果最后也不能到达边界说明是被圈住的,变成2就行了。
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<map> 4 #include<set> 5 #include<iostream> 6 #include<cstring> 7 #include<algorithm> 8 #include<vector> 9 #include<queue> 10 11 using namespace std; 12 13 int n; 14 int mat[35][35]; 15 typedef pair<int, int> pr; 16 int dx[4] = {-1, 1, 0, 0}; 17 int dy[4] = {0, 0, -1, 1}; 18 bool vis[35][35]; 19 20 bool check(int i, int j) 21 { 22 return (i >= 0 && j >= 0 && i < n && j < n); 23 } 24 25 bool bfs(int i, int j) 26 { 27 memset(vis, 0, sizeof(vis)); 28 queue<pr>que; 29 que.push(make_pair(i, j)); 30 while(!que.empty()){ 31 pr p = que.front();que.pop(); 32 if(p.first == 0 || p.first == n - 1 || p.second == 0 || p.second == n - 1)return false; 33 for(int k = 0; k < 4; k++){ 34 int x = p.first + dx[k], y = p.second + dy[k]; 35 if(check(x, y) && mat[x][y] != 1 && !vis[x][y]){ 36 que.push(make_pair(x, y)); 37 vis[x][y] = true; 38 } 39 40 } 41 } 42 return true; 43 } 44 45 int main() 46 { 47 scanf("%d", &n); 48 for(int i = 0; i < n; i++){ 49 for(int j = 0; j < n; j++){ 50 scanf("%d", &mat[i][j]); 51 } 52 } 53 54 for(int i = 0; i < n; i++){ 55 for(int j = 0; j < n; j++){ 56 if(mat[i][j] == 0){ 57 if(bfs(i, j)){ 58 mat[i][j] = 2; 59 } 60 } 61 } 62 } 63 64 for(int i = 0; i < n; i++){ 65 printf("%d", mat[i][0]); 66 for(int j = 1; j < n; j++){ 67 printf(" %d", mat[i][j]); 68 } 69 printf("\n"); 70 } 71 return 0; 72 }
原文:https://www.cnblogs.com/wyboooo/p/10350573.html