博客
关于我
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/

你可能感兴趣的文章
CSUST 2021 周赛 2 题解
查看>>
前后端数据交互之表单
查看>>
剑指offer JZ15 反转链表
查看>>
剑指offer JZ21 栈的压入弹出序列
查看>>
剑指offer JZ31 整数中1出现的次数
查看>>
实现基于scrapy框架的天气预报爬虫hengYangSpaider @572311文
查看>>
maven打包指定名称并去除jar-with-dependencies后缀
查看>>
Netty4服务端入门代码示例
查看>>
操作系统前传第六课--开发中的辅助工具
查看>>
Linux系统编程44 信号 - 信号的响应过程分析!!!
查看>>
VL53L0x TOF激光测距的 stm32 HAL库驱动代码
查看>>
怎么玩LOG4J
查看>>
Oracle创建用户,分配表空间
查看>>
自定义标签(JSP2.0)简单标签
查看>>
MyBatis自定义类型转换器
查看>>
机器学习(湖北师范大学教程)-极大似然估计算法
查看>>
读《红楼梦》有感
查看>>
【C# 重构】—参数化查询, 需要参数,但未提供该参数
查看>>
决策树(二)—— ID3和C4.5
查看>>
MySQL~教你满分回答什么是数据库索引? 索引的数据结构是什么? 什么是事务?
查看>>