Hdu1312 Red and Black(BFS)
作者:互联网
题解目录
前言
这道题可以利用简单的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