当前位置:   article > 正文

HDU 1312 Red and Black (DFS & BFS)_hdu1312红黑地砖问题复杂度

hdu1312红黑地砖问题复杂度

原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1312

题目大意:有一间矩形房屋,地上铺了红、黑两种颜色的方形瓷砖。你站在其中一块黑色的瓷砖上,只能向相邻的黑色瓷砖移动,计算你总共能够到达多少块黑色的瓷砖。

要求:输入包含多组数据,每组数据的第一行输入的是两个整数 W 和 H, 分别表示 x 方向与 y 方向上的瓷砖数量,并且 W 和 H 都不超过20。在接下来的 H 行中,每行包含 W 个字符,每个字符表示一块瓷砖的颜色,规则如下:

          ' . ' 代表黑色的瓷砖

          ' # '代表白色的瓷砖

          ' @ ' 代表黑色的瓷砖,并且你站在这块瓷砖上,该字符在每个数据集合中唯一出现一次。

 

当在一行中读入的是两个零时,表示输入结束。

对每个数据集合,分别输出一行,显示你从初始位置出发能到达的瓷砖数(记数时包括初始位置的瓷砖)。

思路:这道题算是一道比较典型的 DFS 题,但也可以用 BFS 做出来。

代码:

  DFS

  1. #include <iostream>
  2. #include <cstring>
  3. using namespace std;
  4. #define clr(a) memset(a,0,sizeof(a))
  5. const int MAXN = 25;
  6. int dir[2][4]={1, -1 , 0, 0, 0, 0, 1, -1};
  7. int w, h, ans, sx, sy;
  8. int mp[MAXN][MAXN];
  9. char s[MAXN][MAXN];
  10. int DFS(int x,int y){
  11. mp[x][y] = 1;
  12. for(int i=0;i<4;i++){
  13. int dx = x + dir[0][i];
  14. int dy = y + dir[1][i];
  15. if (dx >= 0 && dy >= 0 && dy < w && dx < h &&
  16. s[dx][dy] == '.' && !mp[dx][dy]) {
  17. ans++;
  18. DFS(dx, dy);
  19. }
  20. }
  21. return ans;
  22. }
  23. int main() {
  24. while (scanf("%d %d", &w, &h) != EOF) {
  25. if (w == 0 && h == 0) break;
  26. clr(mp);
  27. for (int i = 0; i < h; i++) {
  28. for (int j = 0; j < w; j++) {
  29. cin >> s[i][j];
  30. if (s[i][j] == '@') {
  31. sx = i;
  32. sy = j;
  33. }
  34. }
  35. }
  36. ans = 1;
  37. cout << DFS(sx, sy) << endl;
  38. }
  39. return 0;
  40. }

BFS (使用 广搜时可以把搜索过的地方用 ' # ' 进行标记)

  1. #include <iostream>
  2. #include <queue>
  3. using namespace std;
  4. const int N = 25;
  5. int w, h, sx, sy, ans;
  6. char s[N][N];
  7. int d[4][2] = {1, 0, -1, 0, 0, 1, 0, -1};
  8. struct node {
  9. int x, y;
  10. };
  11. void bfs() {
  12. node start, end;
  13. queue<node> q;
  14. start.x = sx;
  15. start.y = sy;
  16. q.push(start);
  17. while (!q.empty()) {
  18. start = q.front();
  19. q.pop();
  20. for (int i = 0; i < 4; i++) {
  21. end.x = start.x + d[i][0];
  22. end.y = start.y + d[i][1];
  23. if (end.x >= 0 && end.y >= 0 && end.y < w && end.x < h &&
  24. s[end.x][end.y] == '.' ) {
  25. ans++;
  26. s[end.x][end.y] = '#';
  27. q.push(end);
  28. }
  29. }
  30. }
  31. }
  32. int main() {
  33. while (cin >> w >> h) {
  34. if (w == 0 && h == 0) break;
  35. for (int i = 0; i < h; i++)
  36. for (int j = 0; j < w; j++) {
  37. cin >> s[i][j];
  38. if (s[i][j] == '@') {
  39. sx = i;
  40. sy = j;
  41. }
  42. }
  43. ans = 1;
  44. bfs();
  45. cout << ans << endl;
  46. }
  47. return 0;
  48. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/415137
推荐阅读
相关标签
  

闽ICP备14008679号