LeetCode130-被围绕的区域 DFS与BFS (NOIP c++ 代码)

17 篇文章 0 订阅
16 篇文章 0 订阅

题目描述

给定一个二维的矩阵,包含 'X' 和 'O'字母 O)。找到所有被 'X' 围绕的区域,并将这些区域里所有的 'O' 用 'X' 填充。

// floodfill-dfs.cpp
#include<bits/stdc++.h>
using namespace std;
vector<string> vst;
void dfs(vector<string> & board,int i,int j)
{
	if(i<0||j<0||i>board.size()-1||j>board[0].size()-1)
		return ;
	if(board[i][j]!='O')
		return;
	board[i][j]='V';
	dfs(board,i+1,j);
	dfs(board,i,j+1);
	dfs(board,i-1,j);
	dfs(board,i,j-1);
}
void solve(vector<string> & board)
{
	if(board.empty()||board.size()==1||board[0].size()==1)return;
	for(int i=0; i<board.size(); i++) {
		if(board[i][0]=='O')
			dfs(board,i,0);
		if(board[i][board[0].size()-1]=='O')
			dfs(board,i,board[0].size()-1);
	}
	for(int i=0; i<board[0].size(); i++) {
		if(board[0][i]=='O')
			dfs(board,0,i);
		if(board[board.size()-1][i]=='O')
			dfs(board,board.size()-1,i);
	}
	for(int i=0; i<board.size(); i++) {
		for(int j=0; j<board[0].size(); j++) {
			if(board[i][j]=='V')
				board[i][j]='O';
			else if(board[i][j]=='O')
				board[i][j]='X';

		}

	}

}


int main()
{
	// vector<vector<char> > board(4,vector<char>(4,'X'));
	vst.push_back("XXXX");
	vst.push_back("XOOX");
	vst.push_back("XXOX");
	vst.push_back("XOXX");
	solve(vst);
	for(int i=0; i<vst.size(); i++) {
		for(int j=0; j<vst[0].size(); j++)
			cout<<vst[i][j];
		cout<<endl;
	}
	return 0;
}
//floodfill-bfs
#include<bits/stdc++.h>
using namespace std;
/*vector<string>  b = {
	{'X','X','X','X'},
	{'X','O','O','X'},
	{'X','X','O','X'},
	{'X','O','X','X'}
};*/
vector<string> vst;



struct pos {
	int x, y;
};
void visit(queue<pos> &mypos, int x, int y,
           vector<string >& board)
{
	pos p= {x, y};
	mypos.push(p);
	board[x][y] = '*';
}
void solve(vector<string >& board)//vector<vector<char> > & board)
{
	int row = board.size();
	if(row == 0)
		return;
	int col = board[0].size();

	if(row <= 2 || col <= 2)
		return;
	cout<<"输入:"<<endl;
	for(int i = 0; i < row; i++) {
		for(int j = 0; j < col; j++) {
			cout<<board[i][j];
		}
		cout<<endl;
	}
	queue<pos> mypos;
	for(int i = 0; i < col; i++) {
		if(board[0][i] == 'O') {
			visit(mypos, 0, i, board);
		}
		if(board[row-1][i] == 'O') {
			visit(mypos, row-1, i, board);
		}
	}
	for(int i = 1; i < row-1; i++) {
		if(board[i][0] == 'O') {
			visit(mypos, i, 0, board);
		}
		if(board[i][col-1] == 'O') {
			visit(mypos, i, col-1, board);
		}
	}


	while(!mypos.empty()) {
		pos t = mypos.front();
		mypos.pop();
		if(t.x-1 >= 0 && board[t.x-1][t.y] == 'O')
			visit(mypos, t.x-1, t.y, board);
		if(t.x+1 < row && board[t.x+1][t.y] == 'O')
			visit(mypos, t.x+1, t.y, board);
		if(t.y-1 >= 0 && board[t.x][t.y-1] == 'O')
			visit(mypos, t.x, t.y-1, board);
		if(t.y+1 < col && board[t.x][t.y+1] == 'O')
			visit(mypos, t.x, t.y+1, board);
	}

	for(int i = 0; i < row; i++) {
		for(int j = 0; j < col; j++) {
			if(board[i][j] == 'O')
				board[i][j] = 'X';

			else if(board[i][j] == '*')
				board[i][j] = 'O';
		}
	}
	cout<<"矩阵变为:"<<endl;
	for(int i = 0; i < row; i++) {
		for(int j = 0; j < col; j++) {
			cout<<board[i][j];
		}
		cout<<endl;
	}

}


int main()
{
	vst.push_back("XXXX");
	vst.push_back("XOOX");
	vst.push_back("XXOX");
	vst.push_back("XOXX");
	solve(vst);
	return 0;
}

/*
输入:
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
*/

/*
输入:
X O X X
O O O O
X O X X

变换后:
X O X X
O O O O
X O X X

*/

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值