(LeetCode 130)Surrounded Regions
阿新 • • 發佈:2018-11-06
Q:
Given a 2D board containing ‘X’ and ‘O’, capture all regions surrounded by ‘X’.
A region is captured by flipping all ‘O’s into ‘X’s in that surrounded region.
For example,
X X X X
X O O X
X X O X
X O X X
After running your function, the board should be:
X X X X
X X X X
X X X X
X O X X
實在鬧不來領釦的c++(public class:)寫法 所以手寫了c++的........
題意就是給你一個二維矩陣,裡面包含’O’,’X’,然後把所有被’X’包圍的’O’變為’X’。
題解 :
不被X包圍 則可以從四周入手,如多四周有“O‘’ 並且還連線著O那麼這些“O”都不是被包圍的
可以先變成“#”符號,最後在跑一邊陣列把最原始的“O”變為“X”,“#‘’變為“O”;
dfs法:
#include<cstdio> #include<cstring> #include<string.h> #include<algorithm> #include<iostream> #include<stdlib.h> using namespace std; const int inf=0x3f3f3f3f; const int maxn=10000; char e[maxn][maxn]; int dx[]={0,0,1,-1}; int dy[]={1,-1,0,0}; int n,m; bool judge(int x,int y){ if(x<0||x>=n-1||y<0||y>=m-1||e[x][y]=='X') return false; return true; } void dfs(int x,int y){ e[x][y]='#'; for(int i=0;i<4;i++){ int nx=x+dx[i]; int ny=y+dy[i]; if(judge(nx,ny)){ dfs(nx,ny); } } } int main(){ cin>>n>>m; for(int i=0;i<n;i++) for(int j=0;j<m;j++) cin>>e[i][j]; for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ if(i==0||i==n-1){ if(e[i][j]=='O'){ dfs(i,j); } } if((j==0&&i!=0)||(j==0&&i!=n-1)||(j==m-1&&i!=0)||(j==m-1&&i!=n-1)){ if(e[i][j]=='O'){ dfs(i,j); } } } } for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ if(e[i][j]=='O') e[i][j]='X'; if(e[i][j]=='#') e[i][j]='O'; } } for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ cout<<e[i][j]<<" "; } cout<<endl; } return 0; }
bfs 法:
#include<cstdio> #include<cstring> #include<string.h> #include<algorithm> #include<iostream> #include<stdlib.h> #include<queue> using namespace std; const int inf=0x3f3f3f3f; const int maxn=10000; char e[maxn][maxn]; int dx[]={0,0,1,-1}; int dy[]={1,-1,0,0}; int n,m; struct node{ int x; int y; }; int vis[maxn][maxn]; bool judge(int x,int y){ if(x<0||x>=n-1||y<0||y>=m-1||e[x][y]=='X'||vis[x][y]==0) return false; return true; } void bfs(int x,int y){ struct node now; now.x=x; now.y=y; vis[x][y]=1; e[x][y]='#'; queue<node>q; while(!q.empty()){ struct node t; now=q.front(); e[now.x][now.y]='#'; q.pop(); for(int i=0;i<4;i++){ t.x=now.x+dx[i]; t.y=now.y+dy[i]; if(judge(t.x,t.y)){ vis[t.x][t.y]=1; q.push(t); } } } } int main(){ cin>>n>>m; for(int i=0;i<n;i++) for(int j=0;j<m;j++) cin>>e[i][j]; for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ if(i==0||i==n-1){ if(e[i][j]=='O'){ bfs(i,j); } } if((j==0&&i!=0)||(j==0&&i!=n-1)||(j==m-1&&i!=0)||(j==m-1&&i!=n-1)){ if(e[i][j]=='O'){ bfs(i,j); } } } } for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ if(e[i][j]=='O') e[i][j]='X'; if(e[i][j]=='#') e[i][j]='O'; } } for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ cout<<e[i][j]<<" "; } cout<<endl; } return 0; }
好像並差集也可以寫,我再寫寫
未完待續