#P2096. 红与黑.DFS.填空题

红与黑.DFS.填空题

题目描述

小明站在一个矩形房间里,这个房间的地面铺满了地砖,每块地砖的颜色或是红色或是黑色。小明一开始站在一块黑色地砖上,并且小明从一块地砖可以向上下左右四个方向移动到其他的地砖上,但是他不能移动到红色地砖上,只能移动到黑色地砖上。

请你编程计算小明可以走到的黑色地砖最多有多少块。

输入格式

每组输入首先是两个正整数 W 和 H,分别表示地砖的列行数。(1 ≤ W,H ≤ 20)

接下来 H 行,每行包含 W 个字符,字符含义如下:

  1. “.”表示黑地砖;

  2. “#”表示红地砖;

  3. “@”表示小明一开始站的位置,此位置是一块黑地砖,并且这个字符在每组输入中仅会出现一个。

输出格式

输出小明可以走到的黑色地砖最多有多少块,包括小明最开始站的那块黑色地砖。

样例

6 9
....#.
.....#
......
......
......
......
......
#@...#
.#..#.
45
11 9
.#.........
.#.#######.
.#.#.....#.
.#.#.###.#.
.#.#..@#.#.
.#.#####.#.
.#.......#.
.#########.
...........
59
11 6
..#..#..#..
..#..#..#..
..#..#..###
..#..#..#@.
..#..#..#..
..#..#..#..
6
7 7
..#.#..
..#.#..
###.###
...@...
###.###
..#.#..
..#.#..
13

程序填空

#include<bits/stdc++.h>
using namespace std;
int n,m,ans,w,h;
string v[25];
bool walked[25][25]; //走过的地方设置为 true
int diff[4][2] = { {-1,0},{1,0},{0,-1},{0,1} }; //4个方向,下标0是往上,下标1是往下,下标2是往左,下标3是往右
void dfs(int x,int y)
{
	int xx,yy;
	
	for(int i=0;i<4;i++)
	{
		xx = x + diff[i][0];
		yy = y + diff[i][1];
		
		if(xx>=1&&xx<=m&&yy>=1&&yy<=n&&v[xx][yy]==填空(1)&&填空(2))
		{
			ans = 填空(3);
			walked[xx][yy] = 填空(4);
			填空(5);
		}
	}
}

int main()
{

	cin>>n>>m;
	for(int i=1;i<=m;i++) //m是代表右多少行
	{
		cin>>v[i];
		v[i] = "*" +v[i]; //前面随便加个字符,为了后面下标从 1 开始
		if(v[i].find( 填空(6) )!=v[i].npos)
		{
			w = 填空(7);
			h = 填空(8);
		}		
	}
	
	ans = 填空(9);
	walked[w][h] = true;  //标记这个地方以后不能重复走
	填空(10);  //从 (w,h) 这个坐标开始走,第一个参数是第几行,第二个参数是第几列
	cout<<ans;
	
	return 0;

}

填空(1): {{ input(1) }}

填空(2): {{ input(2) }}

填空(3): {{ input(3) }}

填空(4): {{ input(4) }}

填空(5): {{ input(5) }}

填空(6): {{ input(6) }}

填空(7): {{ input(7) }}

填空(8): {{ input(8) }}

填空(9): {{ input(9) }}

填空(10): {{ input(10) }}