其他分享
首页 > 其他分享> > Hdu1312 Red and Black(BFS)

Hdu1312 Red and Black(BFS)

作者:互联网

题目:Hdu1312 Red and Black

题解目录


前言

这道题可以利用简单的BFS搜索解决。

一、题目陈述

在这里插入图片描述
在这里插入图片描述

二、解决思路

通过BFS搜索所有可能到达的黑色地砖,每当到达一个黑色地砖,就将其状态数组st对应的值置为1表示已经访问过。

三、代码实现

#include<bits/stdc++.h>
using namespace std;
const int N = 100;
int w,h;
int g[N][N];
// 此时站的地方 坐标是(cy,cx) 先竖后横 
int cx,cy;
// 状态数组 访问过就置为true
bool st[N][N]; 
// 能访问到的黑色地砖数 
int res = 0; 
void bfs() {
	typedef pair<int,int> pii;
	queue<pii> q;
	q.push({cy,cx});
	while(!q.empty()) {
		auto t = q.front();
		q.pop();
		int dx[4] = {0,-1,0,1};
		int dy[4] = {-1,0,1,0};
		// 尝试向四个方向拓展 
		for(int i=0;i<4;i++) {
			int ny = t.first + dy[i];
			int nx = t.second + dx[i];
			if(ny>=1&&ny<=h&&nx>=1&&nx<=w&&g[ny][nx]!=1&&!st[ny][nx]) {
				q.push({ny,nx});
				st[ny][nx] = true;
				res ++;
			}
		}
	}
}
int main() {
	while(cin>>w>>h&&w!=0) {
		// 每一个样例计算前的全局变量初始化 
		memset(st,0,sizeof(st)); 
		res = 0;
		
		for(int i=1;i<=h;i++) {
			for(int j=1;j<=w;j++) {
				char c;	cin>>c;
				// 黑色地砖	可以移动 置为0 
				if(c=='.') g[i][j] = 0;
				// 红色地砖 不可移动 置为1 
				else if(c=='#') g[i][j] = 1;
				else {
					cy = i;	cx = j;
					st[cy][cx] = true;
					res ++;
				}
			}
		}
		bfs();
		cout<<res<<endl;
	} 
	return 0;
}

总结

这道题目涉及到的行走方式是只能走有公共边的地砖(上下左右),在BFS搜索的时候可以利用方向数组枚举进行模拟移动。注意在处理每个实例之前都要对全局变量进行初始化。

标签:地砖,int,st,BFS,ny,cy,cx,Black,Red
来源: https://blog.csdn.net/weixin_43681549/article/details/113786712