【BFS】hdu 1312 Red and Black
题目描述:
http://acm.hdu.edu.cn/showproblem.php?pid=1312
中文大意:
一个长方形的房间,铺着方砖,每块方砖被标记为 # 或黑点. 。
一个人站在起点 @ ,可以上、下、左、右移动,但只能移动到标记为黑点的方砖上,不能移动到标记为 # 的方砖上。
要求:求可遍历到的黑点数目。
思路:
(1)把起点 s 放到队列 q 中;
(2)如果 q 是空队列,则过程结束,否则继续;
(3)取队列 q 中最前面的节点 node;
(4)尝试访问 node 节点的四周节点。若没有后继节点,则转到(2);
(5)把 node 的所有后继节点放在队列 q 的末端,并标记为不可再被访问;
(6)转到(2)。
如果有目标节点,则将(6)改为:若后继节点中某一个是目标节点,则找到一个解,过程结束,否则转到(2)。
代码:
#include<bits/stdc++.h>
using namespace std;
struct node
{
int x,y;
};
int dir[4][2] = {
{0, -1}, //上
{1, 0}, //右
{0, 1}, //下
{-1, 0} //左
};
int w,h;
char** room;
bool check(node tem)
{
if(tem.x>=0&&tem.x<w&&tem.y>=0&&tem.y<h)
{
return true;
}
return false;
}
void BFS(int dx, int dy)
{
int num = 1;
node start, next;
start.x = dx;
start.y = dy;
queue<node> q;
q.push(start);
while(!q.empty())
{
start = q.front();
q.pop();
//尝试四个方向
for(int i=0;i<4;i++)
{
next.x = start.x + dir[i][0];
next.y = start.y + dir[i][1];
if(check(next)&&room[next.y][next.x]=='.')
{
room[next.y][next.x] = '#';
num++;
q.push(next);
}
}
}
printf("%d\n", num);
}
int main()
{
while(scanf("%d%d", &w, &h)&&(w!=0&&h!=0))
{
int dx, dy;
room = new char*[h];
for(int i=0;i<h;i++)
{
room[i] = new char[w];
scanf("%s", room[i]);
for(int j=0;j<w;j++)
{
if(room[i][j] == '@')
{
dx = j;
dy = i;
break;
}
}
}
BFS(dx, dy);
}
}