Red and black
Time limit:1000 ms
Memory limit:32768kb
64bit Io format:% I64d & % i64usubmit status
Description
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 H; W and H are the numbers of tiles in the X-and y-directions ctions, respectively. W and H are not more than 20.
There are h more lines in the data set, each of which between des 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 shocould output a line which contains the number of tiles he can reach from the initial tile (including itself ).
Sample Input
6 9....#......#..............................#@...#.#..#.11 9.#..........#.#######..#.#.....#..#.#.###.#..#.#[email protected]#.#..#.#####.#..#.......#..#########............11 6..#..#..#....#..#..#....#..#..###..#..#..#@...#..#..#....#..#..#..7 7..#.#....#.#..###.###[email protected]###.###..#.#....#.#..0 0
Sample output
4559613
Question:
Ask how many steps can be taken at most. '#' is a wall and cannot be taken.
Solution:
BFS.
Code:
#include<iostream>#include<cstdio>#include<queue>#include<cstring>using namespace std;const int maxN=25;int dirI[4]={1,0,-1,0},n,m,is,js;;int dirJ[4]={0,1,0,-1},visited[maxN][maxN];string str[maxN];struct node{ int i,j; node(int i0=0,int j0=0){ i=i0,j=j0; }};void bfs(){ queue <node> path; visited[is][js]=1; path.push(node(is,js)); int cnt=1; while(!path.empty()){ node s=path.front(); path.pop(); for(int i=0;i<4;i++){ int di=s.i+dirI[i],dj=s.j+dirJ[i]; if(di<0||dj<0||di>=n||dj>=m||str[di][dj]=='#') continue; if(visited[di][dj]==1) continue; visited[di][dj]=1; path.push(node(di,dj)); cnt++; } } printf("%d\n",cnt);}int main(){ while(scanf("%d%d",&m,&n)!=EOF&&n&&m){ memset(visited,-1,sizeof(visited)); for(int i=0;i<n;i++){ cin>>str[i]; for(int j=0;j<m;j++){ if(str[i][j]=='@'){ is=i,js=j; } } } bfs(); } return 0;}
HDU 1312 red and black (BFS)