ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

DFS宽度优先的注意事项

2020-01-29 20:44:27  阅读:225  来源: 互联网

标签:标记 复杂度 果冻 DFS 宽度 Nancy 注意事项 include


DFS相关注意事项

思路清晰

先草稿写思路,然后实现DFS

标记

根据题目是否要进行路程的标记

范围

  1. 变量的范围限制
    1. 防止死循环 2. 减少复杂度
  1. 路程的限制
  • 经过的路程的标记与还原

退出

return的使用十分重要

    1. 防止死循环 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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有