回溯法之二维数组

方法一:思路:遍历二维数组把每一个grid[i][j]='O'并且可以由dfs()检测是否可以修改。这种方法太费时间了。 

#include<iostream>
#include<vector>
using namespace std;
vector<vector<char>> grid;
int b[4][4] = {
	{-1,0},
	{0,1},
	{1,0},
	{-1,0}
};
int m, n;
class solution
{
	vector<vector<bool>>visit;
public:
	void test()
	{
		 m = grid.size();
		 n = grid[0].size();
		 visit = vector<vector<bool>>(m, vector < bool >(n, false));
		for (int i = 0; i < m; i++)
			for (int j = 0; j < n; j++)
				if (grid[i][j]=='O'&&dfs(i, j))
					grid[i][j] = 'X';
				
	}
private:
	bool dfs(int x, int y)
	{
		if (x < 0 || x >= m || y < 0 || y >= n)
			return false;
		if (grid[x][y] == 'X')
			return true;
		bool res=true;
		for (int i = 0; i < 4; i++)
		{
			int newx, newy;
			newx = x + b[i][0];
			newy = y + b[i][1];
			if (!visit[newx][newy]&&grid[newx][newy] == 'O')
			{
				visit[x][y] = true;
				res=res&dfs(newx, newy);
				visit[x][y] = false;
			}
			else if(!visit[newx][newy])
				res &= dfs(newx, newy);
			
		}
		return res;
	}
};

方法二:思路:可以只遍历二维数组的最外圈,遇到‘O’就dfs把连通块都标记起来,没有标记的都改为X

#include<iostream>
#include<vector>
using namespace std;
vector<vector<char>> grid;
int b[4][4] = {
	{-1,0},
	{0,1},
	{1,0},
	{0,-1}
};
int m, n;
class solution
{
	vector<vector<bool>>visit;
public:
	void test()
	{
		 m = grid.size();
		 n = grid[0].size();
		 visit = vector<vector<bool>>(m, vector < bool >(n, false));
		 for (int i = 1; i < m-1; i++)
			 if (grid[i][0] == 'O' )
				 dfs(i, 0);
		 for (int i = 1; i < m - 1; i++)
			 if ( grid[i][n - 1]=='O')
				 dfs(i, n - 1);
		 
		 for (int j = 0; j < n; j++)
			 if (grid[0][j] == 'O')
				 dfs(0, j);
		 for (int j = 0; j < n; j++)
			 if (grid[m - 1][j] == 'O')
				 dfs(m - 1, j);
		 for (int i = 0; i < m; i++)
			 for (int j = 0; j < n; j++)
				 if (!visit[i][j] && grid[i][j] == 'O')
					 grid[i][j] = 'X';
		
				
	}
private:
	void dfs(int x, int y)
	{
		if (x < 0 || x >= m || y < 0 || y >= n||grid[x][y]=='X')
			return;
		if(grid[x][y]=='O')
	 		visit[x][y] = true;
		for (int i = 0; i < 4; i++)
		{
			int nx, ny;
			nx = x + b[i][0];
			ny = x + b[i][1];
			if(!visit[nx][ny])
				dfs(nx, ny);
		}
	}
};
发布了98 篇原创文章 · 获赞 1 · 访问量 4489

猜你喜欢

转载自blog.csdn.net/weixin_40823740/article/details/103345322