leet code之Surrounded Regions

题目地址:
Surrounded Regions | LeetCode OJ  https://leetcode.com/problems/surrounded-regions/
此题可用DFS和BFS两种方法解:
解题思路:可以从二维矩阵的最外围开始搜索,所有外围O开始的连通区域O需要保存,所有和外围O不连通的区域O全部变为X;
DFS:
class Solution 
{
public:
	int dfs(int x,int y,int dirx[],int diry[],int lenx,int leny,vector<vector<char>>& board)
	{
		for(int i = 0; i< 4; i++)
		{
			int dxx = x+ dirx[i];
			int dyy = y+ diry[i];

			if(dxx < 0 || dxx >= lenx  || dyy <0 || dyy >=leny)
			{
				continue;
			}
			if(board[dxx][dyy] == 'O')
			{
				board[dxx][dyy] = 'Q';
				dfs(dxx,dyy,dirx,diry,lenx,leny,board);
			}
		}
		return 0;
	}
    void solve(vector<vector<char>>& board)
	{   

		int dirx[4] = {-1,1,0,0};
		int diry[4] = {0,0,-1,1};
		vector<vector<char>>::iterator itr0;
		for(int i = 0; i < board.size();i++)
		{
          for(int j = 0 ; j < board[0].size();j++)
		  {
			  if(i== 0 || i == board.size()-1 || j == 0 || j == board[0].size()-1)
			  {
				  if(board[i][j] == 'O')
				  {
					  board[i][j] = 'Q';
				      dfs(i,j,dirx,diry,board.size()-1,board[0].size()-1,board);
				  }
			  }
		  }
		}
		for(int i = 0; i < board.size();i++)
		{
          for(int j = 0 ; j < board[0].size();j++)
		   {
			  if(board[i][j] == 'Q')
			  {
				  board[i][j] = 'O';
			  }
			  else if(board[i][j] == 'O')
			  {
				  board[i][j] = 'X';
			  }
		   }
		}
	}
};

BFS:
class Solution 
{
public:
	int dfs(int x,int y,int dirx[],int diry[],int lenx,int leny,vector<vector<char>>& board)
	{
		for(int i = 0; i< 4; i++)
		{
			int dxx = x+ dirx[i];
			int dyy = y+ diry[i];

			if(dxx < 0 || dxx >= lenx  || dyy <0 || dyy >=leny)
			{
				continue;
			}
			if(board[dxx][dyy] == 'O')
			{
				board[dxx][dyy] = 'Q';
				dfs(dxx,dyy,dirx,diry,lenx,leny,board);
			}
		}
		return 0;
	}
	int bfs(int x,int y,int dirx[],int diry[],int lenx,int leny,vector<vector<char>>& board)
	{
		typedef struct
		{
			int x;
			int y;
		}NODE;

		NODE queue[1000];
		int head,rear;
		head = 0;
		rear = 0;
		queue[rear].x = x;
		queue[rear].y = y;
		rear++;
		 while(head != rear)
		 {
            NODE cur;
			cur = queue[head];
			for(int i = 0; i< 4; i++)
		    {
				int dxx = cur.x+ dirx[i];
				int dyy  =cur.y+ diry[i];

				if(dxx < 0 || dxx >= lenx  || dyy <0 || dyy >=leny)
				{
					continue;
				}
				if(board[dxx][dyy] == 'O')
				{
					board[dxx][dyy] = 'Q';
					queue[rear].x = dxx;
					queue[rear].y = dyy;
					rear++;
				}
		   }
			head++;
		 }
		
		return 0;
	}
    void solve(vector<vector<char>>& board)
	{   
		int dirx[4] = {-1,1,0,0};
		int diry[4] = {0,0,-1,1};
		vector<vector<char>>::iterator itr0;

		for(int i = 0; i < board.size();i++)
		{
          for(int j = 0 ; j < board[0].size();j++)
		  {
			  if(i== 0 || i == board.size()-1 || j == 0 || j == board[0].size()-1)
			  {
				  if(board[i][j] == 'O')
				  {
					  board[i][j] = 'Q';
				      bfs(i,j,dirx,diry,board.size()-1,board[0].size()-1,board);
				  }
			  }
		  }
		}
		for(int i = 0; i < board.size();i++)
		{
          for(int j = 0 ; j < board[0].size();j++)
		   {
			  if(board[i][j] == 'Q')
			  {
				  board[i][j] = 'O';
			  }
			  else if(board[i][j] == 'O')
			  {
				  board[i][j] = 'X';
			  }
		   }
		}
	}
};


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值