题目描述

:路飞他们伟大航路行程的起点是罗格镇,终点是拉夫德鲁
---------------因为伟大航路上的气候十分异常,所以来往任意两个岛屿之间的时间差别很大,从A岛到B岛可能需要1天,而从B岛到A岛则可能需要1年。
---------------当然,任意两个岛之间的航行时间虽然差别很大,但都是已知的。
现在假设路飞一行从罗格镇(起点)出发,遍历伟大航路中间所有的岛屿(但是已经经过的岛屿不能再次经过),最后到达拉夫德鲁(终点)。假设他们在岛上不作任何的停留,请问,他们最少需要花费多少时间才能到达终点?

思路

DFS,寻找最小时间,重点是把岛的连接顺序写明白
剪枝比较好想,预判时间,是否走过
要走的第一个岛和最后一个岛都是固定的

WA代码(第一次写出来的

#include<stdio.h>
#include<cmath>
#include<cstring>
using namespace std;int island[8][8];
int mintime =1<<30;
int roadtime,islandN;
int visited[8];void dfs(int i,int j,int num){if(visited[i])//已走过 return;if(num==islandN-1){roadtime+=island[i][islandN];//最后一个岛固定的 mintime=min(roadtime,mintime);}if(roadtime+island[i][j]>mintime)//预判 不应该是island[i][j]return;for(;i<islandN;++i){for(;j<islandN;++j){//!就是这里没有考虑岛屿的顺序关系导致 W Avisited[i]=1;roadtime+=island[i][j];dfs(i,j,num++);  roadtime-=island[i][j];visited[i]=0;}}
}int main(){scanf("%d",&islandN);for(int i=0;i<islandN;++i){for(int j=0;j<islandN;++j)scanf("%d",&island[i][j]);printf("\n");}memset(visited,0,sizeof(visited));int num=0;dfs(0,0,num);printf("%d",mintime);
}
return 0;
}

WA分析

在DFS的循环里,我的代码在判断一个岛有没有走过的时候,没有考虑连接关系
visited [ i ][ j ] = 1 ;只是把这个岛标记成了走过,并不能判断是从哪个岛来到这个岛的
剪枝的时候顺序也有问题
输入案例,结果为30,10+20+0=30;全部为第一个岛的时间关系

AC代码

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
using namespace std;
int island[20][20];
int mintime=1<<30;//记录最短的路径
int totaltime=0;//记录目前为止总共走了多少
int visited[20];//记录第i个岛屿是否走过
int n;
int guo=0;//记录走过了哪些岛屿 第i个岛屿如果走过则guo中加上2的i次方
int time[65536][20];//time[i][j]记录已经走过i岛屿(i用二进制表示**所有**走过的岛屿)到达j的最短距离void dfs(int s,int c){//s表示已经走过了s个岛屿(数量),c表示目前在岛屿cif(s==n-1)mintime=min(totaltime+island[c][n-1],mintime);//最后一个岛固定for(int i=1;i<n-1;i++){if(!visited[i]){//未走过int q=guo+pow(2,i);//q:所有走过岛(包括i)的二进制表达,guo+=也可以,简写if(totaltime+island[c][i]>=time[q][i])continue;//减支搜索 全局范围 走到C岛比目前已知的最短时间长则无需继续搜索time[q][i]=totaltime+island[c][i];//更新最小值visited[i]=1;guo+=pow(2,i);totaltime+=island[c][i];   dfs(s+1,i);//表示岛之间的连接关系totaltime-=island[c][i];guo-=pow(2,i);//回溯visited[i]=0;}}
}int main(){for(int i=0;i<65535;i++)for(int j=0;j<20;j++)time[i][j]=1<<30;cin>>n;for(int i=0;i<n;i++)for(int j=0;j<n;j++)cin>>island[i][j];memset(visited,0,sizeof(visited));visited[0]=1;guo+=1;dfs(1,0);cout<<mintiem<<endl;return 0;
}

心得

  1. dfs函数传达了岛的顺序( s , c )
  2. time[ i ][ j ]二维函数,记录所有走过岛到 c岛 的最小时间,
    超强剪枝,全局范围包含所有搜索情况
  3. 二进制表示不会发生数字相同的情况
  4. visited[ i ]表示在这个搜索分支中有哪些岛走过了
  5. 没错,看的又是别人的代码,自己只能WA,道阻且长

DFS.04-海贼王之伟大航路相关推荐

  1. POJ海贼王之伟大航路(dfs)

    C:海贼王之伟大航路 总时间限制: 1000ms 内存限制: 65536kB 描述 "我是要成为海贼王的男人!",路飞一边喊着这样的口号,一边和他的伙伴们一起踏上了伟大航路的艰险历 ...

  2. DFS 简单的剪枝和状态压缩 海贼王之伟大航路

    今天碰到了这样一道题目,是一个关于深搜的题目 4124:海贼王之伟大航路 查看 提交 统计 提示 提问 总时间限制:  1000ms  内存限制:  65536kB 描述 "我是要成为海贼王 ...

  3. OpenJudge P4979 海贼王之伟大航路 DFS

    海贼王之伟大航路 Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Descriptio ...

  4. 海贼王之伟大航路解题报告

    海贼王之伟大航路解题报告 总时间限制: 1000ms   内存限制: 65536kB 描述 "我是要成为海贼王的男人!",路飞一边喊着这样的口号,一边和他的伙伴们一起踏上了伟大航路 ...

  5. 海贼王之伟大航路——状压记忆化搜索

    海贼王之伟大航路 题意: 一共 n 个点,给定任意两点的距离 dis[i,j]dis[i, j]dis[i,j]. 问,从点 1 到点 n,中途所有节点经过且仅经过一次,距离最短为多少? (2< ...

  6. NOI 4.5 动态规划 4979:海贼王之伟大航路(深搜剪枝)

    题目来源:http://noi.openjudge.cn/ch0405/4979/ 4979:海贼王之伟大航路 总时间限制: 1000ms 内存限制: 65536kB 描述 "我是要成为海贼 ...

  7. poj 4124:海贼王之伟大航路

    4124:海贼王之伟大航路 查看 提交 统计 提示 提问 总时间限制:  1000ms  内存限制:  65536kB 描述 "我是要成为海贼王的男人!",路飞一边喊着这样的口号, ...

  8. bailianoj 4124海贼王之伟大航路

    bailianoj 4124海贼王之伟大航路 题目大意 以第一个岛为起点,最后一个岛为终点.问从第一个岛到最后一个岛所需要的的最短时间是多少.其中岛i到岛i所需花费的时间为0,岛i岛到j的时间和岛j到 ...

  9. POJ h0248.海贼王之伟大航路

    海贼王之伟大航路 "我是要成为海贼王的男人!",路飞一边喊着这样的口号,一边和他的伙伴们一起踏上了伟大航路的艰险历程. 路飞他们伟大航路行程的起点是罗格镇,终点是拉夫德鲁(那里藏匿 ...

  10. 【算法练习】搜索/剪枝 百炼 poj4124:海贼王之伟大航路

    参考blog:http://blog.sina.com.cn/s/blog_a8efbf5d0102vo9u.html 题目链接:http://bailian.openjudge.cn/practic ...

最新文章

  1. 【青少年编程】【四级】数字之和
  2. R基于H2O包构建深度学习模型实战
  3. tfs管理java代码_使用Intellij Idea连接Team Foundation Server (TFS)实现代码版本管理
  4. 使用pip来安装pyOpenSSL
  5. 江苏计算机三级偏软怎么学,计算机三级偏软
  6. mysql中基本的DML语句
  7. JavaScript 断点调试技巧
  8. ZooKeeper数据模型
  9. 判断深度学习模型的稳定性_问题引领构建数学模型,讲练结合促进深度学习
  10. android的Service
  11. github安装_安装ROS时无法初始化(无法连接raw.github)的解决方案
  12. 一篇真正教会你开发移动端页面的文章(二)
  13. php 图片相似度对比算法,PHP实现的简易版图片相似度比较
  14. 空间中点到直线的距离
  15. C++取字符串长度函数三种方法
  16. 想网站稳定运营?不可不知 DDoS的攻击原理与防御方法
  17. linux下的护眼软件
  18. 【组队学习】【35期】组队学习内容详情
  19. 时区、时间戳、日期、夏令时、冬令时
  20. 区块链龙头股都有哪些?区块链概念股有哪些?

热门文章

  1. css自动均匀分布,如何在CSS中均匀分布?
  2. iOS开发中一些有用的小代码
  3. 解决Django migrate: Your models in app(s): ‘Mymodelclassname‘ have changes that are not yet reflected
  4. Visual studio未能正确加载“Microsoft.VisualStudio.Editor.Implementation.EditorPackage”包等问题解决
  5. 计算机系统配置低会带来,低配电脑装什么系统?电脑配置低重装什么系统好
  6. 电脑搜索不到部分wifi,搜索不到部分2.4G频率的wif,手机开热点电脑搜不到wifi。
  7. sockaddr与sockaddr_in,sockaddr_un结构体详解
  8. i58400升级可以换什么cpu_宝贝标题关键词顺序可以换吗?关键词顺序对标题有什么影响?...
  9. 26.Nginx详解
  10. 微信推送平台-测试号定制推送