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;
}
好像并差集也可以写,我再写写
未完待续