Hdu1312 Red and Black(BFS)

题目:Hdu1312 Red and Black


前言

这道题可以利用简单的BFS搜索解决。
BFS的两个基本特点:1.可以求最小 2.基于迭代,所以不会爆栈

一、题目陈述

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

二、解决思路

通过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搜索的时候可以利用方向数组枚举进行模拟移动。注意在处理每个实例之前都要对全局变量进行初始化。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

codertea

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值