首页 > 代码库 > ZOJ 2165

ZOJ 2165

Red and Black

Time Limit: 2 Seconds      Memory Limit: 65536 KB

There is a rectangular room, covered with square tiles. Each tile is colored either red or black. A man is standing on a black tile. From a tile, he can move to one of four adjacent tiles. But he can‘t move on red tiles, he can move only on black tiles.

Write a program to count the number of black tiles which he can reach by repeating the moves described above.


Input

The input consists of multiple data sets. A data set starts with a line containing two positive integers W and HW and H are the numbers of tiles in the x- and y- directions, respectively. W and H are not more than 20.

There are H more lines in the data set, each of which includes W characters. Each character represents the color of a tile as follows.

  • ‘.‘ - a black tile
  • ‘#‘ - a red tile
  • ‘@‘ - a man on a black tile(appears exactly once in a data set)


Output

For each data set, your program should output a line which contains the number of tiles he can reach from the initial tile (including itself).


Sample Input

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


Sample Output

45
59
6
13

 

BFS

什么时候++是问题所在

昨天看的题目

今天忘记了题目输出要求

WA了三次

 

#include <iostream>#include <queue>#include <string>#include <cstring>using namespace std;const int maxw = 25;bool visit[maxw][maxw];char tiles[maxw][maxw];int step[4][2]={{1,0},{0,1},{0,-1},{-1,0}};int w,h;class Node{public:    int x,y;    void init(int a,int b)    {       x=a;       y=b;    }};int bfs(Node begin){    int num = 0;    queue<Node> Q;    Q.push(begin);    memset(visit,false,sizeof(visit));    visit[begin.x][begin.y]=true;    num++;    while(Q.empty()!=true)    {        Node a = Q.front();        Q.pop();        if(visit[a.x][a.y]==false)        {            num++;            visit[a.x][a.y]=true;        }        for(int i =0;i<4;i++)        {            int x=a.x+step[i][0];            int y=a.y+step[i][1];            if(x>=0&&x<h&&y>=0&&y<w&&visit[x][y]==false&&tiles[x][y]==.)            {                Node b;                b.init(x,y);                Q.push(b);            }        }    }    return num;}int main(){    Node begin;    while(cin>>w>>h)    {        if(w+h==0)            return 0;        string s;        for(int i=0;i<h;i++)        {            cin>>s;            for(int j=0;j<w;j++)            {                char ch = s.at(j);                if(ch==@)                {                    begin.init(i,j);                }                tiles[i][j]=ch;            }        }        cout<<bfs(begin)<<endl;    }    return 0;}