HDU 1312 Red and Black(bfs,dfs均可,個人傾向bfs)
題目代號:HDU 1312
題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=1312
Red and Black
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 20820 Accepted Submission(s): 12673
Write a program to count the number of black tiles which he can reach by repeating the moves described above.
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
[email protected]
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
59
6
13
題目大意:一個男子站在‘.’上,他不能走到‘#’上問他能走到的‘.’的數量是多少。
解題思路:初始點bfs四個方向都遍歷一次即可。
差點被自己氣哭,第一次提交的時候忘記初始化數組,因為沒有判斷邊界,直接導致WA。
AC代碼:
# include <stdio.h> # include <string.h> # include <stdlib.h> # include <iostream> # include <fstream> # include <vector> # include <queue> # include <stack> # include <map> # include <math.h> # include <algorithm> using namespace std; # define pi acos(-1.0) # define mem(a,b) memset(a,b,sizeof(a)) # define FOR(i,a,n) for(int i=a; i<=n; ++i) # define For(i,n,a) for(int i=n; i>=a; --i) # define FO(i,a,n) for(int i=a; i<n; ++i) # define Fo(i,n,a) for(int i=n; i>a ;--i) typedef long long LL; typedef unsigned long long ULL; const int MAXM=25; char a[MAXM][MAXM]; int n,m,ans; int cx[]={-1,1,0,0}; int cy[]={0,0,-1,1}; struct node { int x,y; }; queue<node>Q; void bfs() { while(!Q.empty()) { int x=Q.front().x; int y=Q.front().y; Q.pop(); for(int i=0;i<4;i++) { int tx=x+cx[i]; int ty=y+cy[i]; if(a[tx][ty]==‘.‘) { ans++; a[tx][ty]=‘#‘; Q.push(node{tx,ty}); } } } } int main() { //freopen("in.txt", "r", stdin); while(cin>>m>>n,n&&m) { mem(a,0); for(int i=1;i<=n;i++) { cin>>a[i]+1; for(int j=1;j<=m;j++) { if(a[i][j]==‘@‘) { Q.push(node{i,j}); a[i][j]=‘#‘; } } } ans=1; bfs(); cout<<ans<<endl; } return 0; }
HDU 1312 Red and Black(bfs,dfs均可,個人傾向bfs)