题目链接:点击查看

题目大意:给出10张牌,随机分布在1~10十个不同的位置,要求模拟蜘蛛纸牌的游戏规则,问移动的最短距离之和是多少

题目分析:我们可以直接dfs搜索,但需要想清楚该怎么搜索,这个题目有点贪心的思想,因为要求移动距离之和最小,所以我们应该尽量避免多余的移动,简单来说,我们只需要将当前牌放置到比当前牌序号大1的牌上就行,说起来可能有些抽象,举个例子,牌1只需要移动到牌2上即可,不需要移动到牌3上然后再移动到牌2上之类的,相对的,牌10的位置就固定了,因为牌10在哪里都一样。

然后就是搜索了,因为不一定是按照顺序来的,不一定是牌1放到牌2上,然后牌2带着牌1放到牌3上,也可能是牌2先放到牌3上,然后牌1再放到牌2上等等等等,所以我们在搜索时,第一层for需要枚举所当前轮次所需要移动的牌,然后第二层for需要寻找比当前牌序号大1的牌的位置,然后放上去即可,一开始我就是不太会处理第二层for循环,以为单纯的用i+1来判断就行,果不其然的WA了一发,其实可以换个思想,比如我们已经将牌4放到牌5上了,那么我们接下来需要将牌3放到牌4上,我们该处理的距离肯定不是abs(a[3]-a[4])了,因为此时的牌4已经到了牌5的位置,所以正确距离应该是abs(a[3]-a[5])才对,所以我们的vis数组保存的是每一堆扑克中最底层的那个牌的大小,并且根据规则,我们可以保证这个牌的序号一定是该堆牌中最大的一张,所以我们在寻找目标牌的位置时,只需要在i+1-10中找到第一个在最底层的数即可,假设我们找到的目标牌是k,则可以保证第i+1~k张牌已经放到了第k张牌的上面

emmm,可能理解起来有点麻烦,但毕竟也是我想了有一个小时才想明白的问题。。直接挂代码吧,和网上绝大部分的代码一样:

#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cstring>
#include<algorithm>
#include<stack>
#include<queue>
#include<map>
#include<sstream>
using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=15;int a[N];int ans;bool vis[N];void dfs(int pos,int cnt)
{if(cnt>=ans)//最优性剪枝return;if(pos==9)//若所有牌的情况都处理完毕,更新结果{ans=cnt;return;}for(int i=1;i<10;i++)//选择需要移动的牌{if(!vis[i]){vis[i]=true;for(int j=i+1;j<=10;j++)//找目标牌的位置if(!vis[j]){dfs(pos+1,cnt+abs(a[i]-a[j]));break;}vis[i]=false;}}
}int main()
{
//  freopen("input.txt","r",stdin);int w;cin>>w;while(w--){for(int i=1;i<=10;i++){int num;scanf("%d",&num);a[num]=i;}memset(vis,false,sizeof(vis));ans=100;//答案初始化为100,其实到90就行,强迫症凑个整dfs(0,0);printf("%d\n",ans);}return 0;
}

HDU - 1584 蜘蛛牌(dfs+最优性剪枝)相关推荐

  1. hdu 1584蜘蛛牌(DFS)

    蜘蛛牌 Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  2. (step4.3.9)hdu 1584(蜘蛛牌——DFS)

    题目大意:本体是中文题,可以直接在OJ上看 /** 1584_2.cpp** Created on: 2013年8月22日* Author: Administrator*/#include <i ...

  3. HDU 1584 蜘蛛牌(DFS)

    蜘蛛牌 Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  4. HDU - 1584 蜘蛛牌 【DFS】

    Description 蜘蛛牌是windows xp操作系统自带的一款纸牌游戏,游戏规则是这样的:只能将牌拖到比她大一的牌上面(A最小,K最大),如果拖动的牌上有按顺序排好的牌时,那么这些牌也跟着一起 ...

  5. HDU - 1584 蜘蛛牌

    蜘蛛牌是windows xp操作系统自带的一款纸牌游戏,游戏规则是这样的:只能将牌拖到比她大一的牌上面(A最小,K最大),如果拖动的牌上有按顺序排好的牌时,那么这些牌也跟着一起移动,游戏的目的是将所有 ...

  6. HDU—1584 蜘蛛牌 (深搜)

    蜘蛛牌是windows xp操作系统自带的一款纸牌游戏,游戏规则是这样的:只能将牌拖到比她大一的牌上面(A最小,K最大),如果拖动的牌上有按顺序排好的牌时,那么这些牌也跟着一起移动,游戏的目的是将所有 ...

  7. hdu 1584 蜘蛛牌(bfs+set)

    蜘蛛牌 Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  8. HDU1584 蜘蛛牌 DFS回溯

    点击打开链接 蜘蛛牌 Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota ...

  9. POJ - 3700 Missile Defence System.(dfs+最优性剪枝)

    题目链接:点击查看 题目大意:给出n个导弹的飞行高度,规定一个导弹拦截装置只能拦截严格升序的导弹或严格降序的导弹,问拦截所有导弹需要最少多少个拦截装置 题目分析:之前做过一个dp题,那个题目简单,是只 ...

最新文章

  1. docker 镜像修改的配置文件自动还原_原创 | 全网最实在的docker入门教程四
  2. python argpare 模块的简单用法
  3. 石器时代修改完以后服务器启动不了,石器时代 石器EE 突发问题“突发断连”服务器故障说明...
  4. numpy不用科学记数发 python_Python科学计算库Numpy常用的函数使用
  5. 工业交换机厂家,工业交换机品牌前十大排名
  6. pip3 便捷安装包
  7. js 单精度浮点数转10进制_确保前端 JavaScript 浮点数精度的四则运算方法
  8. mysql 基础面试_面试必问之mysql基础
  9. Gsensor/Gyro数据滤波算法思考
  10. 【知识学习】最大公因数gcd
  11. 如何优化网站才能让网站打开速度更快
  12. 如何将大量图片文件合并成一个*.bin文件
  13. android手机变windows8,安卓手机如何把手机界面投屏到windows8/10电脑上
  14. RoboCup仿真3D底层通信模块介绍(二)
  15. BUUCTF_Crypto题目题解记录1
  16. Illustrator CS5扭曲功能初学者必读(2)——宽度工具
  17. 分享2个优质牛肉干的挑选方法
  18. python mel
  19. 190327-Matlab清除指定变量之外的所有变量
  20. Docker容器内安装ping工具

热门文章

  1. 非关系型数据库(非RDBMS)介绍
  2. EventLoopGroup 与Reactor
  3. MyBatis关键配置-接口注入使用
  4. Redis中的Sentinel 配置
  5. 包含用法 includeFilters
  6. weblogic获取应用目录路径
  7. JasperReport:声明周期
  8. 使用Sidecar支持异构平台的微服务
  9. java bean传索引_Java如何设置bean的索引属性值?
  10. 计算机领域中,增量是什么意思?