78被圍繞的區域(130)
阿新 • • 發佈:2020-09-11
作者:
晚於: 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; }