DFS宽度优先的注意事项
作者:互联网
DFS相关注意事项
思路清晰
先草稿写思路,然后实现DFS
标记
根据题目是否要进行路程的标记
范围
- 变量的范围限制
-
- 防止死循环 2. 减少复杂度
- 路程的限制
- 经过的路程的标记与还原
退出
return的使用十分重要
-
- 防止死循环 2. 减少复杂度
链接:https://ac.nowcoder.com/acm/contest/3947/J 来源:牛客网
题目描述
Nancy喜欢吃果冻! Nancy钻进了一个
n×n×n的果冻里,她想从(1,1,1)一路上、下、左、右、前、后六个方向吃到(n,n,n)。
但果冻毕竟是有许多口味的,标记为*的口味是Nancy不愿意吃的,其余的果冻均标记为.。 Nancy不想吃坏肚子,于是她想尽可能少的吃果冻。
下面给出果冻的情况,请你帮忙计算一下她能吃多少块果冻叭! 输入描述:
第一行:一个整数n。接下来n层,每组n行,每行n列,表示果冻(i,j,k)的情况(如题目描述所述)。数据满足:1≤n≤100,
保证果冻(1,1,1)不是Nancy不愿意吃的。 输出描述:
如果可以到达(n,n,n),请输出路上吃的果冻数量,否则请输出-1。
示例1
输入
2
.*
..
*.
..
输出
4
下面不是能AC的代码(DFS不能做出来,时间复杂度太大)
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
#define ll long long
#define abs(x) ((x)<0? -(x):(x))
#define min(a,b) ((a)<(b) ? (a):(b))
int ms = -2, n;
char v[101][101][101] = { '0' },vs[101][101][101] = { '0' };
void dfs(int x, int y, int z, int s)
{
vs[x][y][z] == '*';//标记路线
if (x == n && y == n && z == n)
{
if (ms == -2) ms = s;
if (s < ms) ms = s;
return;
}
if (v[x + 1][y][z] == '.' && x + 1 <= n && vs[x + 1][y][z] == '.')
{
dfs(x + 1, y, z, s + 1);
vs[x+1][y][z] == '.';//还原标记路线
}
else if (v[x][y + 1][z] == '.' && y + 1 <= n && vs[x][y + 1][z] == '.')
{
dfs(x, y + 1, z, s + 1);
vs[x][y+1][z] == '.';
}
else if (v[x][y][z + 1] == '.' && z + 1 <= n && vs[x][y][z + 1] == '.')
{
dfs(x, y, z + 1, s + 1);
vs[x][y][z+1] == '.';
}
else if (v[x - 1][y][z] == '.' && vs[x - 1][y][z] == '.')
{
dfs(x - 1, y, z, s + 1);
vs[x-1][y][z] == '.';
}
else if (v[x][y - 1][z] == '.' && vs[x][y - 1][z] == '.')
{
dfs(x, y - 1, z, s + 1);
vs[x][y-1][z] == '.';
}
else if (v[x][y][z - 1] == '.' && vs[x][y][z - 1] == '.')
{
dfs(x, y, z - 1, s + 1);
vs[x][y][z-1] == '.';
}
}
int main()
{
cin >> n;
//cout << n << "\n";
for (int z = 1; z <= n; z++)
{
for (int x = 1; x <= n; x++)
{
for (int y = 1; y <= n; y++)
{
cin >> v[x][y][z];
vs[x][y][z] = '.';
}
//if (z != n && x != n)getchar();//不需要getchar()!!!
}
}
dfs(1, 1, 1, 0);
cout << ms + 1;
return 0;
}
weixin_45543995
发布了2 篇原创文章 · 获赞 0 · 访问量 36
私信
关注
标签:标记,复杂度,果冻,DFS,宽度,Nancy,注意事项,include 来源: https://blog.csdn.net/weixin_45543995/article/details/104109679