Red and Black
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 12640 Accepted Submission(s): 7801
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
'@' - a man on a black tile(appears exactly once in a data set)
6 9 ....#. .....# ...... ...... ...... ...... ...... #@...# .#..#. 11 9 .#......... .#.#######. .#.#.....#. .#.#.###.#. .#.#..@#.#. .#.#####.#. .#.......#. .#########. ........... 11 6 ..#..#..#.. ..#..#..#.. ..#..#..### ..#..#..#@. ..#..#..#.. ..#..#..#.. 7 7 ..#.#.. ..#.#.. ###.### ...@... ###.### ..#.#.. ..#.#.. 0 0
45 59 6 13题意 找到@能经过的“.”的个数。代码:/* 时间 2015/7/22 23:09 感受:收获甚大。
*/ #include<stdio.h>
#include<string.h> #include<iostream> #include<algorithm> using namespace std; int dk[25][25]; char dp[25][25]; int ds[4][2]={{0,-1},{0,1},{-1,0},{1,0}}; int W ,H; void dfs(int x,int y)//对数据进行搜索 { int i; for(i=0;i<4;i++) { int dx=x+ds[i][0]; int dy=y+ds[i][1]; if(dx<H&&dx>=0&&dy>=0&&dy<W) { if(!dk[dx][dy]&&dp[dx][dy]=='.') { dk[dx][dy]=1;//把可行数据进行标记。 dfs(dx,dy);//继续搜索 } } } } int main() { int i,j; while(scanf("%d%d",&W,&H)!=EOF,W&&H) { memset(dk,0,sizeof(dk)); for(i=0;i<H;i++) scanf("%s",dp[i]); int x,y; for(i=0;i<H;i++) for(j=0;j<W;j++) if(dp[i][j]=='@') { x=i,y=j; break; } dk[x][y]=1; dfs(x,y); int ans=0;//对标记数据进行统计。 for(i=0;i<H;i++) for(j=0;j<W;j++) if(dk[i][j]==1) ans++; printf("%d\n",ans); } return 0; }