1:红与黑
-
总时间限制:
- 1000ms 内存限制:
- 65536kB
-
描述
- 有一间长方形的房子,地上铺了红色、黑色两种颜色的正方形瓷砖。你站在其中一块黑色的瓷砖上,只能向相邻的黑色瓷砖移动。请写一个程序,计算你总共能够到达多少块黑色的瓷砖。 输入
-
包括多个数据集合。每个数据集合的第一行是两个整数W和H,分别表示x方向和y方向瓷砖的数量。W和H都不超过20。在接下来的H行中,每行包括W个字符。每个字符表示一块瓷砖的颜色,规则如下
1)‘.’:黑色的瓷砖;
2)‘#’:白色的瓷砖;
3)‘@’:黑色的瓷砖,并且你站在这块瓷砖上。该字符在每个数据集合中唯一出现一次。
当在一行中读入的是两个零时,表示输入结束。
输出
- 对每个数据集合,分别输出一行,显示你从初始位置出发能到达的瓷砖数(记数时包括初始位置的瓷砖)。 样例输入
-
6 9 ....#. .....# ...... ...... ...... ...... ...... #@...# .#..#. 0 0
样例输出
45
思路:略。
出现的错误整理:
1.全局变量初始化。
brace-enclosed needed。
2.c = getchar();返回读入字符的ASCII值。(好久不打代码的代价TT)
3.注意遍历时边界为>=0,包括0在内。
4.getchar(吃回车)。
5.visited[][] reset。(chessboard不需reset,其值自动更新,且更新区域外不会访问到。)
#include<iostream>
using namespace std;
bool chessboard[1000][1000] = { 0 };
bool visited[1000][1000] = { 0 };
int DFS(int i, int j, int w, int h)
{
int number = 1;
visited[i][j] = 1;
if ((i - 1) >= 0 && chessboard[i - 1][j] && !visited[i - 1][j])
{
number += DFS(i - 1, j, w, h);
}
if ((i + 1)<h&&chessboard[i + 1][j] && !visited[i + 1][j])
{
number += DFS(i + 1, j, w, h);
}
if ((j - 1) >= 0 && chessboard[i][j - 1] && !visited[i][j - 1])
{
number += DFS(i, j - 1, w, h);
}
if ((j + 1)<w&&chessboard[i][j + 1] && !visited[i][j + 1])
{
number += DFS(i, j + 1, w, h);
}
return number;
}
int main(void)
{
int flag = 0, flag_x = 0, flag_y = 0;
int w, h;
char c;
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
while (scanf("%d %d", &w, &h)) {//
if (!w || !h)
break;
getchar();//
for (int i = 0; i<h; i++)
{
for (int j = 0; j<w; j++)
{
if ((c = getchar()) == '.')
{
chessboard[i][j] = 1;
}
else if (c == '#')
{
chessboard[i][j] = 0;
}
else if (c == '@')
{
flag_x = i;
flag_y = j;
chessboard[i][j] = 1;
}
}
getchar();//line break
}
cout << DFS(flag_x, flag_y, w, h) << endl;//
for (int i = 0; i<h; i++)
{
for (int j = 0; j<w; j++)
{
visited[i][j] = 0;
}
}
}
return 0;
}