Description - 题目描述
有个铺满方形瓷砖的矩形房间,每块瓷砖的颜色非红即黑。某人在一块砖上,他可以移动到相邻的四块砖上。但他只能走黑砖,不能走红砖。 敲个程序统计一下这样可以走到几块红砖上。
Input - 输入
多组测试用例。每组数组开头有两个正整数W和H;W与H分别表示 x- 与 y- 方向上瓷砖的数量。W和W均不超过20。 还有H行数据,每行包含W个字符。每个字符表示各色瓷砖如下。 '.' - 一块黑砖 '#' - 一块红砖 '@' - 一个黑砖上的人(一组数据一个人) 输入以一行两个零为结束。
Output - 输出
对于每组测试用例,输出他从起始砖出发所能抵达的瓷砖数量(包括起始砖)。
6 9 ....#. .....# ...... ...... ...... ...... ...... #@...# .#..#. 11 9 .#......... .#.#######. .#.#.....#. .#.#.###.#. .#.#..@#.#. .#.#####.#. .#.......#. .#########. ........... 11 6 ..#..#..#.. ..#..#..#.. ..#..#..### ..#..#..#@. ..#..#..#.. ..#..#..#.. 7 7 ..#.#.. ..#.#.. ###.### ...@... ###.### ..#.#.. ..#.#.. 0 0
Sample Output - 输出样例
45 59 6 13
分析:
感觉这个系列的题目都是比较水一点的,不过对于搜索入门的话,还是会比较适合就是了,闲来无事就随便写了写题解。 对于BFS和DFS,感觉BFS一般是用来求解最值问题,然后DFS只是确认某个问题的答案或者某个要求是否可以到达。 这个题只是单纯的问能到达砖块的个数,所以采用的是DFS. 将输入的地图进行遍历找到当前位置,然后设为起始点,设立一个方向数组,用来决定前进的方向,即上下左右, 将经过的位置进行标记,然后遍历整个地图之后的结果就是答案。
代码:
#include <stdio.h> #include <string.h> int n, m, ans=0; char map[25][25]; bool isVisited[25][25]; int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}}; bool isIn(int x, int y){ if(x<0 || x>=n || y<0 || y>=m || isVisited[x][y] == true || map[x][y] == '#') return false; return true; } void doIt(int x, int y){ isVisited[x][y] = true; ans++; } void DFS(int x, int y){ for(int i=0;i<4;i++) if(isIn(x+dir[i][0], y+dir[i][1])){ doIt(x+dir[i][0], y+dir[i][1]); DFS(x+dir[i][0], y+dir[i][1]); } } int main(){ while(scanf("%d%d ",&m, &n) == 2){ if(n==0 && m==0) break; int x, y; for(int i=0; i<n; i++){ scanf("%s",map[i]); for(int j=0; j<m; j++) if(map[i][j] == '@'){ x=i; y=j; } } memset(isVisited,false,sizeof(isVisited)); ans = 1; isVisited[x][y] = true; DFS(x,y); printf("%d ",ans); } return 0; }