博客
关于我
kuangbin题单 进阶搜素 深度优先搜索 哈密顿绕行世界问题 HDU2181
阅读量:345 次
发布时间:2019-03-04

本文共 1070 字,大约阅读时间需要 3 分钟。

打卡 day4
先拿一道题练练手,一会儿再开新题,拒绝水题。
这题好像挺简单的,输出全路径,就是深搜搜完一条路径之后不要退,接着搜第二条,直到所有路径都搜完为止。
然后就是一个被问过两遍,自己一直也没有太清楚的,就是:

vis[next]=1;dfs(next,idx+1);vis[next]=0;

到底什么时候需要回溯,为什么有的题不用回溯也结果正确,现在知道是测试数据弱,或者说题面说保证只有一条路径。vis数组再次标记为0代表这个点没有访问过,如果不回溯,记录全路径,不同路径之间会发生“撞车”,我用这个点,另一条路径也用这个点,但是因为我走过了这个点,所以该点已经被标记为访问过,其它路再来走的话,会视为访问过,但其实没有。但是回溯之后表示我用完了这个点,我有把我的访问擦除,让其它路也能经过这个点。

AC代码:

#include<iostream>#include<cstdio>#include<queue>#include<algorithm>#include<string>#include<cstring>#include<vector>using namespace std;int maps[22][3];int p[22];int vis[22];int n;int cnt;void dfs(int val,int idx){   	p[idx]=val;	for(int i=0;i<3;i++){   		int next=maps[val][i];		if(idx==19&&next==n){   			printf("%d:  ",cnt++);			for(int j=0;j<20;j++){   				printf("%d ",p[j]);			}			printf("%d\n",next);		}		if(!vis[next]){   			vis[next]=1;			dfs(next,idx+1);			vis[next]=0;		}	}}int main(){   	int a,b,c;	for(int i=1;i<=20;i++){   		scanf("%d%d%d",&maps[i][0],&maps[i][1],&maps[i][2]);	}	while(scanf("%d",&n)){   		if(n==0) break;		memset(vis,0,sizeof(vis));		vis[n]=1;		cnt=1;		dfs(n,0);	}	return 0;}

转载地址:http://lhdr.baihongyu.com/

你可能感兴趣的文章
vue if else用法。
查看>>
a标签提交表单
查看>>
vue 官方实例教程 markdown demo
查看>>
CSS border-style 属性
查看>>
Python数据类型 列表、元组、集合、字典的区别和相互转换
查看>>
宝塔配置404 502页面
查看>>
jquery each 操作批量数据
查看>>
Mac OS X 下 su 命令提示 sorry 的解决方法
查看>>
vue-router 缓存路由组件对象
查看>>
移动端 触摸事件和mousedown、mouseup、click事件之间的关系
查看>>
js中事件捕获和事件冒泡(事件流)
查看>>
js的各种数据类型判断(in、hasOwnProperty)
查看>>
严格模式、混杂模式与怪异模式
查看>>
一篇文章带你搞定 Java 中字符流的基本操作(Write / Read)
查看>>
HTML 和 CSS 简单实现注册页面
查看>>
(Java)让枚举实现一个接口
查看>>
XML 解析学习
查看>>
验证码的简单实现
查看>>
解决 vscode 窗口故障
查看>>
JSP 入门学习
查看>>