HDU1312 Red and Black(黑红砖块)(dfs入门水题)

题目链接:点击打开链接

题目大意:有一个长方形的房间,铺满了正方形瓷砖。每个瓷砖都是红色或黑色的。一个人站在一块黑色的瓷砖上。从一个瓷砖上,他可以移动到四个相邻(上下左右)的瓷砖中的一个。但是他不能移动到红色的瓷砖,只能在黑色的瓷砖上移动。通过重复上面描述的动作,编写一个程序来计算他能达到的黑瓷砖的数量。

输入:多个数据。第一行给出两个数m,n(0,0代表结束输入);m代表列,n代表行。m,n均不超过20。对每一块瓷砖,填入“@”代表人站的初始位置(黑砖),“.”代表黑色砖,“#”代表红色砖.

输出:输出人能踩过的黑色砖的总数(第一块人站的那个也算)。

样例:

 
6 9
....#.
.....#
......
......
......
......
......
#@...#
.#..#.
11 9
.#.........
.#.#######.
.#.#.....#.
.#.#.###.#.
.#.#..@#.#.
.#.#####.#.
.#.......#.
.#########.
...........
11 6
..#..#..#..
..#..#..#..
..#..#..###
..#..#..#@.
..#..#..#..
..#..#..#..
7 7
..#.#..
..#.#..
###.###
...@...
###.###
..#.#..
..#.#..
0 0

 

输出:

 

45

59

6

13

思路:从第一个@开始搜索,对该瓷砖的上下左右四个方向进行搜索,遇见“.”则继续进行,(这时候把“.”替换成“#”,代表搜过了,避免重搜),ans++(黑砖数+1).

代码如下:

#include
#include
using namespace std;
char room[21][21];        //初始化房间
int n,m;
int ans;
void dfs(int i,int j){
    if(i<0||i>=n||j<0||j>=m||room[i][j]=='#')   //判断是不是超出了范围
    return ;
    ans++;
    room[i][j]='#';      //搜到“.”后先替换成“#”
    dfs(i-1,j);dfs(i+1,j);dfs(i,j+1);dfs(i,j-1);//四个方向进行搜索
}

int main(){
	
	while(scanf("%d%d",&m,&n)!=EOF)
	{
	   if(m==0&&n==0)
	 {
	   break;
	 }
	
	else{
	for(int i=0;i>room[i][j];
		}
	}
	   ans=0;
	for(int i=0;i

 

上述代码中用cin读入room数组的方法优化:

 

for(int i=0;i 和using namespace std;在运行吧。

 

你可能感兴趣的:(OJ刷题,图论)