1. 程式人生 > 實用技巧 >78被圍繞的區域(130)

78被圍繞的區域(130)

作者: Turbo時間限制: 1S章節: 寬度優先搜尋

晚於: 2020-08-26 12:00:00後提交分數乘係數50%

截止日期: 2020-09-02 12:00:00

問題描述 :

給定一個二維的矩陣,包含 'X' 和 'O'(字母 O)。

找到所有被 'X' 圍繞的區域,並將這些區域裡所有的 'O' 用 'X' 填充。

示例:

X X X X

X O O X

X X O X

X O X X

執行後,矩陣變為:

X X X X

X X X X

X X X X

X O X X

解釋:

被圍繞的區間不會存在於邊界上,換句話說,任何邊界上的 'O' 都不會被填充為 'X'。 任何不在邊界上,或不與邊界上的 'O' 相連的 'O' 最終都會被填充為 'X'。如果兩個元素在水平或垂直方向相鄰,則稱它們是“相連”的。

輸入說明 :

首先輸入矩陣的行數m和列數n,

然後輸入m行,每行n個字元'X'或'O'。中間無空格分隔。

1<=m, n<=200

輸出說明 :

輸出結果,字元'X'或'O'之間無空格。

輸入範例 :

輸出範例 :

#include <iostream>
#include <vector>
#include <queue>
using namespace std;
/*class Solution {
public:
    void solve(vector<vector<char>>& board) {
        
    }
};
*/ //反面思想,找出所有與邊界相連的O,做個標記,最後遍歷沒被標記的O class Solution { int m,n; public : void solve(vector<vector<char>> &board) { if(board.size()==0||board[0].size()==0) return ; m=board.size(); n=board[0].size(); for(int i=0;i<m;i++) { dfs(board,i,
0);//對第一列的O深優 dfs(board,i,n-1);//對最後一列深優 } for(int j=0;j<n;j++){ //對第一列和最後一列的所有O進行深度優先搜尋 dfs(board,0,j);//對第一行的O深優 dfs(board,m-1,j);//對最後一行深優 } for(int i=0;i<m;i++) { //遍歷矩陣,將O變為X,將-變為O for(int j=0;j<n;j++) { if(board[i][j]=='O') board[i][j]='X'; if(board[i][j]=='-') board[i][j]='O'; } } return ; } /** * 使用遞迴進行深度優先搜尋 */ void dfs(vector<vector<char>> &board,int i,int j){ if(i<0||j<0||i>=m||j>=n||board[i][j]!='O') //遞迴終止條件判斷 return; board[i][j]='-'; //將當前O更改為- dfs(board,i-1,j); //遞迴該點上方的點 dfs(board,i+1,j); //遞迴該點下方的點 dfs(board,i,j-1); //遞迴該點左邊的點 dfs(board,i,j+1); //遞迴該點右邊的點 return ; } }; int main() { vector<vector<char> > board; int m,n; cin>>m; cin>>n; char ch; for(int i=0; i<m; i++) { vector<char> aLine; for(int j=0; j<n; j++) { cin>>ch; aLine.push_back(ch); } board.push_back(aLine); } Solution().solve(board); for(int i=0; i<board.size(); i++) { vector<char> aLine = board[i]; for(int j=0; j<aLine.size(); j++) cout<<aLine[j]; cout<<endl; } return 0; }