洛谷P1162 傳送門
先上原題:
題目就是要找到一個封閉的圖形,即被1
完全包圍的0
。封閉圖形保證一定有且只有一個。
顯然,圖形的最外面一圈的0
肯定不是封閉圖形的一部分,所以剛開始我想搜索除了最外圈
以外的0
,只要搜索遇到了邊界就不滿足題意。但是後來寫的過程中還是發現存在一些問題。
然後就開始想別的思路,其實可以發現,既然封閉圖形只有一個,不封閉的圖形一定會到達邊界,那麼我們可以反着來,把所有不封閉的圖形都找出來,那麼封閉圖形也就知道了,所以思路就是把最外圈的0
全部用bfs搜索,標記所有不封閉的0
代碼如下:
#include <stdio.h>
#include <cstring>
#include <iostream>
#include <string>
#include <cmath>
#include <algorithm>
#include <cstdlib>
#include <queue>
#include <deque>
#include <cstring>
#include <iterator>
#include <set>
#include <map>
using namespace std;
#define ll long long
int mp[35][35];
int mov[4][2] = {1, 0, 0, 1, -1, 0, 0, -1};
int vis[35][35];
int vis2[35][35];//標記與最外圈的0相連的所有0
int n;
int dfs(int x, int y)
{
vis2[x][y] = 1;
for (int i = 0; i < 4; i++)
{
int xx = x + mov[i][0];
int yy = y + mov[i][1];
if (xx < 1 || yy < 1 || xx > n || yy > n || vis[xx][yy] || mp[xx][yy])
continue;
vis[xx][yy] = 1;
dfs(xx, yy);
}
}
int main()
{
cin >> n;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
cin >> mp[i][j];
for (int i = 1; i <= n; i++)
if (mp[i][1] == 0)
dfs(i, 1);
for (int i = 1; i <= n; i++)
if (mp[i][n] == 0)
dfs(i, n);
for (int j = 1; j <= n; j++)
if (mp[1][j] == 0)
dfs(1, j);
for (int j = 1; j <= n; j++)
if (mp[n][j] == 0)
dfs(n, j);
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
if (mp[i][j] == 0 && vis2[i][j] == 0)
printf("2 ");
else
printf("%d ", mp[i][j]);
cout << endl;
}
return 0;
}