题意:

一排杂乱的牌,牌间距为1,每次移动只能将小的牌,移动到较大牌上,最终使得牌从小到大排好在一堆。问移动的最小距离。

题目:

蜘蛛牌是windows xp操作系统自带的一款纸牌游戏,游戏规则是这样的:只能将牌拖到比她大一的牌上面(A最小,K最大),如果拖动的牌上有按顺序排好的牌时,那么这些牌也跟着一起移动,游戏的目的是将所有的牌按同一花色从小到大排好,为了简单起见,我们的游戏只有同一花色的10张牌,从A到10,且随机的在一行上展开,编号从1到10,把第i号上的牌移到第j号牌上,移动距离为abs(i-j),现在你要做的是求出完成游戏的最小移动距离。

Input

第一个输入数据是T,表示数据的组数。
每组数据有一行,10个输入数据,数据的范围是[1,10],分别表示A到10,我们保证每组数据都是合法的。

Output

对应每组数据输出最小移动距离。

Sample Input

1
1 2 3 4 5 6 7 8 9 10

Sample Output

9

思路:

1.对移动牌的先后顺序进行枚举(全排列,当然要剪枝)
2.其实这道题很简单,但由于我忽略了,break导致错误,所以我来总结下此类搜索题的做法:找某种最优情况,(1)若为图一般用记忆化搜索(2)若为线性结构就基本上是全排列将所有情况排列出来,找出最优解。由于复杂度比较大,所以剪枝是比较重要的。
3 对本题来说,我们只能将较小牌放到较大牌上,若最优一定是某些段先结合最终得到一堆。所以类似全排列,若最优只能让较小牌到达离他最近的没有标记过的较大牌,故找到后需跳出循环。得到使某些段先结合的效果。
4 全排列的搜索模板

void dfs(int step)//step 表示当前在第几个位置
{int i;if(step==n+1)//如果step==n+1表示前n个数字已经放好 {for(i=1;i<=n;i++)//输出一种全排列 printf("%d",a[i]);printf("\n");return; }for(i=1;i<=n;i++)  //每次搜索都从1-n 一一尝试 {if(book[i]==0)//判断次数字是否用过 {a[step]=i;//存储当前位置的数字,以便满足条件输出 book[i]=1;//当前数字已用过,改变标志,以防重用 dfs(step+1);//放好当前位置数字之后,安排下一个数字 book[i]=0;//回溯,当满足一种全排列后,进行下一种尝试 }}return ;
}
dfs(1);

AC代码

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int inf=0x3f3f3f;
int  a[20],ans,book[20];
void dfs(int step,int num)
{if(step==9){ans=num;return ;}for(int i=1; i<10; i++)if(!book[i]){book[i]=1;for(int j=i+1; j<=10; j++)if(!book[j]&&abs(a[j]-a[i])+num<ans){dfs(step+1,num+abs(a[i]-a[j]));break;/*从位置i走到j只能是i到没有标记过的第一个j(在递归过程中实现中间的某一段结合,再从头到尾结合)*/}book[i]=0;}return ;
}
int main()
{int t;scanf("%d",&t);while(t--){for(int i=1; i<=10; i++){int c;scanf("%d",&c);a[c]=i;}ans=inf;memset(book,0,sizeof(book));dfs(0,0);printf("%d\n",ans);}return 0;
}

蜘蛛牌 HDU - 1584(搜索——达到先让某些段先结合,达最优解)相关推荐

  1. HDU - 1584 蜘蛛牌

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

  2. HDU 1584 蜘蛛牌(DFS)

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

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

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

  4. hdu 1584蜘蛛牌(DFS)

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

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

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

  6. HDU - 1584 蜘蛛牌 【DFS】

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

  7. HDU1584 蜘蛛牌 DFS回溯

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

  8. 北方大学 ACM 多校训练赛 第十五场 蜘蛛牌A

    题目描述 XCX最近迷上了玩蜘蛛牌.蜘蛛牌是windowsxp操作系统自带的一款纸牌游戏,游戏规则是这样的:只能将牌拖到比它大一的牌上面(A最小,K最大),如果拖动的牌上有按顺序排好的牌时,那么这些牌 ...

  9. 蜘蛛牌窗口-游戏规则和说明

    package ck; import javax.swing.*; import java.awt.*; /** 窗口*/ public class AD extends JDialog {JPane ...

最新文章

  1. html监听页面关闭事件,JS针对浏览器窗口关闭事件的监听方法集锦
  2. Python----面向对象---property的使用
  3. php文件里直接写上?xml version=1.0 encoding=utf-8?出错?
  4. json文件示例_Spark SQL - JSON数据集
  5. linux查看进程占用pcu,Linux运维:如何使用ss代替netstat命令
  6. 我在微信上大学:如何正确理解指针和结构体指针?
  7. Linux学习之服务器搭建——DHCP服务器
  8. 前端学习(2482):关于接口的调错
  9. 直连串口线、交叉串口线
  10. 关于Memcache使用的工具类
  11. 排序 之 快排、归并、插入 - 时间复杂度----掌握思想和过程
  12. find找多个单元格的文本_灵活套用LEFT、RIGHT、MID、FIND函数,解决90%的信息提取问题...
  13. 2017.10.22 最多的方案 失败总结
  14. React中的三种类型组件介绍
  15. 2020-02-27
  16. 关键信息基础设施网络风险地图
  17. 重磅消息:微信支付分最新开通方法!
  18. ToC战场进入尾声,ToB市场战争厮杀即将升级?
  19. Lua学习笔记--table
  20. PTrade交易数据更新——从零到实盘17

热门文章

  1. linux c之在终端如何依赖.o文件(静态链接库)运行C文件的命令
  2. linux之so文件、a文件、o文件的区别
  3. linux之网络编程ICMP校验算法
  4. linux c之perror和exit使用总结
  5. Android之Andorid studio 解决Error:Configuration with name ‘default‘ not found
  6. Linux怎么查询全部容器时间,linuxea:如何单单修改docker容器的系统时间
  7. 美丽又实用的欧拉螺线,数学界当之无愧的画家!
  8. 首次公开!人教版1-9年级绝密编写:被重点中小学永久收录的数学教案和试题...
  9. 每日一笑 | 我写了一段代码,为什么不能运行呢?
  10. python版本差异_python的版本的差别 2,3