(LeetCode 130)Surrounded Regions

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;	 
} 





好像并差集也可以写,我再写写

未完待续

猜你喜欢

转载自blog.csdn.net/gml1999/article/details/83627010