标签:
思路:从起点开始向四个方向进行深度优先搜索,搜索过的点置为#(避免重复搜索)。
对于字符地图的输入来说,在大多数情况下用cin输入较scanf更为简便。
1 #include<iostream> 2 using namespace std; 3 #define MAX_W 20 4 #define MAX_H 20 5 char room[MAX_W][MAX_H]; 6 int W, H; 7 //四方向数组的设置 8 const int direction[4][2] = { {-1, 0}, {1, 0}, {0, -1}, {0, 1},}; 9 int step = 0; 10 int dfs(const int& x, const int& y) 11 { 12 //将走过的点设置为#,不会出现重复搜索的情况 13 room[x][y] = ‘#‘; 14 ++step; 15 for (int i = 0; i < 4; ++i) 16 { 17 int nx = x + direction[i][0]; 18 int ny = y + direction[i][1]; 19 if (nx >= 0 && nx < W && ny >= 0 && ny < H && room[nx][ny] == ‘.‘) 20 { 21 dfs(nx, ny); 22 } 23 } 24 return step; 25 } 26 27 ///////////////////////////SubMain////////////////////////////////// 28 29 int main() 30 { 31 //输入两数据且在都不为0时一直循环的书写方法 32 while (cin >> W >> H, W > 0) 33 { 34 step = 0; 35 //这样定义变量对for循环的书写有一定简化。若初始化为0,还可省略for中的第一部分 36 int x, y; 37 //用二维数组[][]的角标方式表示 x.y ,注意输入时用嵌套for循环次序为:外y内x。 38 //此后都用x,y的次序。(循环和角标都是x,y哦) 39 for (y = 0; y < H; ++y) 40 { 41 for (x = 0; x < W; ++x) 42 { 43 //关于数组字符的输入采用C++中的cin更为简便 44 cin >> room[x][y]; 45 } 46 } 47 //用bool作为判断标记能有效避免计算机不必要的运算,头文件为iostream 48 bool found = false; 49 for (x = 0; x < W; ++x) 50 { 51 for (y = 0; y < H; ++y) 52 { 53 if (room[x][y] == ‘@‘) 54 { 55 found = true; 56 break; 57 } 58 } 59 if (found) 60 { 61 break; 62 } 63 } 64 cout << dfs(x, y) << endl; 65 } 66 return 0; 67 }
标签:
原文地址:http://www.cnblogs.com/xlsryj/p/4737224.html