目录
二.P1596 [USACO10OCT] Lake Counting S
一.P1683 入门
算法思想:设置瓷砖状态st,这里瓷砖状态是否走过决定计数与否,因为可以重复走过但只记一次,所以可以不用回溯。每一次dfs都记录此时的坐标与进入可能的新坐标。
const int N = 25;
int W, H;
char map[N][N];//存地图
bool st[N][N];//存每个瓷砖走过状态
int res;//记录走过的瓷砖数
//记录4个方向
int dx[4] = { 1,-1,0,0 };
int dy[4] = { 0,0,1,-1 };
//当前访问到的坐标是(x,y)
void dfs(int x, int y)
{
//模拟走迷宫
for (int i = 0; i < 4; i++)
{
int a = x + dx[i], b = y + dy[i];//新坐标
if (a < 0 || a >= H || b < 0 || b >= W) continue;//是否超出边界
if (map[a][b] != '.') continue;//是否为坏瓷砖
if (st[a][b]) continue; //是否已经走过这块瓷砖
st[a][b] = true;//设置已走瓷砖的状态
res++;
dfs(a, b);
/*这里可以重复走瓷砖但不多次计数,无需回溯*/
}
}
int main()
{
scanf("%d %d", &W, &H);
for (int i = 0; i < H; i++)
scanf("%s", map[i]);
for (int x = 0; x < H; x++)
{
for (int y = 0; y < W; y++)
{
if (map[x][y] == '@')