寒假刷题之普通之红与黑
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了寒假刷题之普通之红与黑相关的知识,希望对你有一定的参考价值。
Description - 题目描述
敲个程序统计一下这样可以走到几块红砖上。
Input - 输入
还有H行数据,每行包含W个字符。每个字符表示各色瓷砖如下。
‘.‘ - 一块黑砖
‘#‘ - 一块红砖
‘@‘ - 一个黑砖上的人(一组数据一个人)
输入以一行两个零为结束。
Output - 输出
Sample Input - 输入样例
6 9 ....#. .....# ...... ...... ...... ...... ...... #@...# .#..#. 11 9 .#......... .#.#######. .#.#.....#. .#.#.###.#. .#.#[email protected]#.#. .#.#####.#. .#.......#. .#########. ........... 11 6 ..#..#..#.. ..#..#..#.. ..#..#..### ..#..#..#@. ..#..#..#.. ..#..#..#.. 7 7 ..#.#.. ..#.#.. ###.### [email protected] ###.### ..#.#.. ..#.#.. 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\n",ans);
}
return 0;
}
以上是关于寒假刷题之普通之红与黑的主要内容,如果未能解决你的问题,请参考以下文章