洛谷P1162 填塗顏色-簡單DFS

洛谷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;
}
發佈了55 篇原創文章 · 獲贊 54 · 訪問量 7410
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章