dfs的连通块问题

01迷宫
连通块:在搜索的过程中,从开始的块开始,它能走过的块是连在一起的,即它们能够走的最大距离是是相同的。所以在搜索的过程中,我们要把走过的先连在一起,用个数组储存走过的每一块,然后在搜索的最后,对在数组的每一块赋值。

#include
#include 
using namespace std;
int n;
char maze[1005][1005];		//储存地图
int ans[1005][1005];		//储存答案
bool hashmap[1005][1005];	//记录走过了吗
int in[1000001][3];		//用来储存连通块
struct Node {
	int row;
	int column;
};
queue<Node> q;		//声明一个队列
void bfs();
bool judge(int,int);
int main()
{
	int m, t, j;
	cin >> n >> m;
	for (t = 0; t < n; t++) {
		cin >> maze[t];
	}
	Node first;
	int x, y;
	for (t = 0; t < m; t++) {
		cin >> x >> y;
		first.row = x;
		first.column = y;
		if (hashmap[x][y])
			cout << ans[x][y]<<endl;
		else 
		{
			q.push(first);		//把开始的点放进队列
			bfs();
			cout << ans[x][y] << endl;
		}
	}
}

void bfs()
{
	int X[4] = { 1,0,-1,0 };
	int Y[4] = { 0,-1,0,1 };
	int total = 1;
    Node first = q.front();
    int x = first.row;
	int y = first.column;
    in[tootal][1] = x;
	in[total][2] = y;
	while (q.size()!=0)
	{
		
		q.pop();
		int t;
		hashmap[x][y] = true;
		for (t = 0; t < 4; t++) {
			if (!judge(x + X[t], y + Y[t]));
			else if(!hashmap[x + X[t]][y + Y[t]] && maze[x - 1][y - 1] != maze[x + X[t] - 1][y + Y[t] - 1])
			{
				Node temp;
				temp.row = x + X[t];
				temp.column = y + Y[t];
				hashmap[x + X[t]][y + Y[t]] = true;
				in[total][1] = temp.row;
				in[total][2] = temp.column;
				q.push(temp);
				total++;		//连通块的个数,也就是当前走过的块数
			}
		}
        if(q.size()!=0)
        {
            first=q.front();
            x=first.row;
            y=first.column;
        }
        
	}

	for (int t=1; t <= total; t++)		//给连通块赋值
	{
		ans[in[t][1]][in[t][2]] = total;
	}
}
bool judge(int x, int y)
{
	if (x < 1 || x > n || y < 1 || y > n)
		return false;

	return true;
}

你可能感兴趣的:(dfs,dfs,队列)