Red and Black(BFS和DFS)

题目:

有一个长方形的房间,覆盖了正方形的磁砖。每块磁砖的颜色,要么是红色,要么是黑色。一名男子站在一块黑色的磁砖上。他可以从一块磁砖移至相邻四块磁砖中的某一块。但是,他不允许在红色磁砖上移动,他只允许在黑色磁砖上移动。

编写一个程序,使得他允许重复上述的移动,判断他所能到达的黑色磁砖的数量。
输入

输入由多个数据集组成。数据集的起始行包含了两个正整数 W 和 H;W 和 H 分别是 x- 和 y- 方向的磁砖数量。W 和 H 不超过 20 。

在数据集中,还有 H 行,每行包含了 W 个字符。每个字符按如下方式表示一块磁砖的颜色。

'.' - 一块黑色的磁砖
'#' - 一块红色的磁砖
'@' - 一名男子,站在一块黑色磁砖上 (在一个数据集中,恰好出现一次)

以包含两个 0 的一行,表示输入结束。

输出

对于每个数据集,程序应当输出一行,包含他从初始磁砖所能抵达的磁砖数量 (包括初始磁砖自身)。

示例输入

6 9
....#.
.....#
......
......
......
......
......
#@...#
.#..#.
11 9
.#.........
.#.#######.
.#.#.....#.
.#.#.###.#.
.#.#..@#.#.
.#.#####.#.
.#.......#.
.#########.
...........
11 6
..#..#..#..
..#..#..#..
..#..#..###
..#..#..#@.
..#..#..#..
..#..#..#..
7 7
..#.#..
..#.#..
###.###
...@...
###.###
..#.#..
..#.#..
0 0

示例输出

45

59

6

13
分析:
用BFS遍历,遍历过的标记为1,当前进到的地点在规定的范围内是黑色,并且没有遍历过的时候,num+1;


注意下面的这个情形:

输入:
       3 3
       #.#
       @#.
       #.#

正确的输出:1     (因为@当前正处在黑色方格上)

 

BFS代码:

 #include<iostream>
 #include<cstring>
 #include<queue>
 using namespace std;
 char a[25][25];
 int flag[4][2]={1,0,-1,0,0,1,0,-1};
 int m[25][25];
 int num,fg;
 struct knot
{
     int x,y;
};
 knot t,b,c;
 int h,w;
 void bfs(int f,int e)
 {
     queue<knot>s;
     fg=0;
     t.x=f;
     t.y=e;
     num=1;
     s.push(t);
    while(!s.empty())
     {
         b=s.front();
         s.pop();
 
         for (int i=0;i<4;i++)
         {
             t.x=b.x+flag[i][0];
             t.y=b.y+flag[i][1];
             if (t.x>0&&t.x<=w&&t.y>0&&t.y<=h&&a[t.x][t.y]!='#'&&!m[t.x][t.y])
            {
                 fg=1;
                  num++;
                 m[t.x][t.y]=1;
                 s.push(t);
             }
         }
    }
 }
 int main()
{
      int x,y;
     while (cin>>h>>w&&(h!=0||w!=0))
     {
         memset(m,0,sizeof(m));
      for (int i=1;i<=w;i++)
             for (int j=1;j<=h;j++)
            {
                cin>>a[i][j];
                if (a[i][j]=='@')
                 x=i,y=j;
            }
            bfs(x,y);
            if (fg==1)
                cout << num-1 << endl;
            else
                cout << num << endl;
     }
     return 0;
 }

 

 

 

DFS代码:

#include<iostream>
 #include<cstring>
 #include<queue>
 using namespace std;
 char a[25][25];
 int flag[4][2]={1,0,-1,0,0,1,0,-1};
 int m[25][25];
 int num,fg;
 struct knot
{
     int x,y;
};
 knot t,b,c;
 int h,w;
 void dfs(int f,int e)
 {
         for (int i=0;i<4;i++)
         {
             int xi=f+flag[i][0];
             int yi=e+flag[i][1];
             if (xi>0&&xi<=w&&yi>0&&yi<=h&&a[xi][yi]!='#'&&!m[xi][yi])
            {
                 m[xi][yi]=1;
                 num++;
                 dfs(xi,yi);
             }
         }
}

 int main()
{
      int x,y;
     while (cin>>h>>w&&(h!=0||w!=0))
     {
         num=0;
         memset(m,0,sizeof(m));
      for (int i=1;i<=w;i++)
             for (int j=1;j<=h;j++)
            {
                cin>>a[i][j];
                if (a[i][j]=='@')
                 x=i,y=j;
            }
            dfs(x,y);

                cout << num << endl;
     }
     return 0;
 }

 

posted @ 2017-07-24 19:57  你的女孩居居  阅读(128)  评论(0编辑  收藏  举报