by BrotherRoot
E - Red and Black
题意:
在M×N的棋盘上有红和黑两种方格,黑方格能够通行,红方个不能通行。求从指定的黑方格出发能够到达的方格总数
思路:
从起点进行floodfill,然后统计被访问的方格。
代码:
#include<cstdio>
const int MAXSIZE = 20;
const int DIRECTNUM = 4;
const int DIRECT[DIRECTNUM][2] = {{1,0},{-1,0},{0,1},{0,-1}};
int Map[MAXSIZE+2][MAXSIZE+2];
bool Visitable[MAXSIZE+2][MAXSIZE+2];
int W, H, sx, sy;
bool Input();
void Clear();
int DFS(int, int);
int main()
{
while (Input()) {
printf("%d\n", DFS(sx, sy));
}
return 0;
}
bool Input()
{
scanf("%d%d\n", &W, &H);
if (W==0 || H==0) {
return false;
}
Clear();
char cache[MAXSIZE+1];
for (int j=1; j<=H; ++j) {
gets(cache);
for (int i=1; i<=W; ++i) {
switch (cache[i-1]) {
case '@':
sx = i;
sy = j;
// 这里没有break
case '.':
Map[i][j] = 1;
break;
case '#':
Map[i][j] = 0;
break;
}
}
}
return true;
}
void Clear()
{
for (int i=0; i<=W+1; ++i) {
for (int j=0; j<=H+1; ++j) {
Visitable[i][j] = false;
Map[i][j] = 0;
}
}
}
int DFS(int x, int y)
{
if (!Map[x][y] || Visitable[x][y]) {
return 0;
}
Visitable[x][y] = true;
int count = 1;
for (int i=0; i<DIRECTNUM; ++i) {
count += DFS(x + DIRECT[i][0], y + DIRECT[i][1]);
}
return count;
}