您的位置:首页 > 其它

POJ 1979 red and black

2015-08-17 17:37 253 查看
POJ 1979 red and black

思路:从起点开始向四个方向进行深度优先搜索,搜索过的点置为#(避免重复搜索)。

对于字符地图的输入来说,在大多数情况下用cin输入较scanf更为简便。

#include<iostream>
using namespace std;
#define MAX_W 20
#define MAX_H 20
char room[MAX_W][MAX_H];
int W, H;
//四方向数组的设置
const int direction[4][2] = { {-1, 0}, {1, 0}, {0, -1}, {0, 1},};
int step = 0;
int dfs(const int& x, const int& y)
{
//将走过的点设置为#,不会出现重复搜索的情况
room[x][y] = '#';
++step;
for (int i = 0; i < 4; ++i)
{
int nx = x + direction[i][0];
int ny = y + direction[i][1];
if (nx >= 0 && nx < W && ny >= 0 && ny < H && room[nx][ny] == '.')
{
dfs(nx, ny);
}
}
return step;
}

///////////////////////////SubMain//////////////////////////////////

int main()
{
//输入两数据且在都不为0时一直循环的书写方法
while (cin >> W >> H, W > 0)
{
step = 0;
//这样定义变量对for循环的书写有一定简化。若初始化为0,还可省略for中的第一部分
int x, y;
//用二维数组[][]的角标方式表示 x.y ,注意输入时用嵌套for循环次序为:外y内x。
//此后都用x,y的次序。(循环和角标都是x,y哦)
for (y = 0; y < H; ++y)
{
for (x = 0; x < W; ++x)
{
//关于数组字符的输入采用C++中的cin更为简便
cin >> room[x][y];
}
}
//用bool作为判断标记能有效避免计算机不必要的运算,头文件为iostream
bool found = false;
for (x = 0; x < W; ++x)
{
for (y = 0; y < H; ++y)
{
if (room[x][y] == '@')
{
found = true;
break;
}
}
if (found)
{
break;
}
}
cout << dfs(x, y) << endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: