问题描述:hdu1312 大概意思是指给定一个起点标为@,.是可以走的路,#是不可以走的路,求能走的路的最大值(包括起点)
分析:本题需要遍历所有的点,跟老鼠走迷宫差不多,是一个扩散的过程,因此可以用BFS进行搜索。
源代码:
#include <bits/stdc++.h>
using namespace std;
char room[23][23];
int dir [4][2] =
{
{-1, 0}, //向左,左上角的坐标是(0,0)
{0, -1}, //向上
{1, 0}, //向右
{0, 1} //向下
};
int Wx, Hy, num; //Wx是行,Hy是列。用num统计可走的位置有多少
bool check(int x, int y)
{
return (x < Wx && x >= 0 && y < Hy && y >= 0); //是否在room中
}
struct node
{
int x, y;
};
void BFS(int dx, int dy)
{
num = 1; //起点也包含在砖块内
queue<node> q; //队列放坐标点
node start, next;
start.x = dx;
start.y = dy;
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]; //按左、上、右、下4个方向顺时针注意搜索
next.y = start.y + dir[0][i];
if (check(next.x,next.y) && room[next.x][next.y] == '.')
{
room[next.x][next.y] = '#'; //进队之后标记为已经处理过
num ++;
q.push(next);
}
}
}
}
int main()
{
int x, y, dx, dy;
while(cin >> Wx >> Hy)
{
if (Wx == 0 && Hy == 0)
break;
for (y = 0; y < Hy; y++)
{
for (x = 0; x < Wx; x++)
{
cin >>room[x][y];
if (room[x][y] == '@')
{
dx = x;
dy = y;
}
}
}
num = 0;
BFS(dx, dy);
cout << num << endl;
}
return 0;
}
对于BFS是一个从今及远的过程,使用队列(或者模拟队列)
附队列的一些语法:
queue<Type> q; //定义队列
q.push(item) //把item放进队列
q.front(item) //返回队首元素
q.pop(item) //删除队首元素
q.back() //返回队尾元素
q.size() //返回元素个数
q.empty() //检查队列是否为空