蜘蛛牌

Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 3716    Accepted Submission(s): 1586

Problem Description
蜘蛛牌是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
Author
xhd
Source
冬练三九之二
Recommend
lcy   |   We have carefully selected several similar problems for you:   1430  1732  1429  1495  1518 

Statistic |  Submit |  Discuss |  Note

起初队友一直说是贪心。。于是我也用贪心水了一发

果然Wa..

于是就用万能的搜索了。

搜索难点就在于怎么去重。也就是判断某种序列已经使用过了。

我用的是set容器。里面放string检测。把1~10十个数字当作字符来存。

在使用bfs之前,我们要明确一个问题。

纸牌的放置规则:只能将牌拖到比她大一的牌上面(A最小,K最大),如果拖动的牌上有按顺序排好的牌时,那么这些牌也跟着一起移动

根据这个规则,我们就可以知道对于某一个位置上的所有牌,我们只要存贮它的最上面的一张牌和最下面的一张牌即可。

当需要移动某个位置a,b牌时:

  • a->b:判断a.top-b.bottom是否为1,如果为1,证明可以移动,移动后更新b.bottom=a.top
代码:
#include <stdio.h>
#include <string.h>
#include <queue>
#include <set>
#include <iostream>
using namespace std;
char str[15];
struct node
{char str[15];char top[15];char bottom[15];int cost;int count; friend bool operator<(node a,node b){return a.cost>b.cost;}
};
int bfs()
{priority_queue<node>s;set<string>ss;ss.clear();node node1,node2;node1.cost=node1.count=0;strcpy(node1.str,str);strcpy(node1.top,str);strcpy(node1.bottom,str);s.push(node1);while(!s.empty()){node2=node1=s.top();s.pop();if(node1.count==9) return node1.cost;if(ss.find(node1.str)!=ss.end()) continue;ss.insert(node1.str);for(int r=1;r<10;r++){for(int i=0;i<10;i++){if(node1.str[i]=='-'||node1.str[i+r]=='-') continue;if(node1.bottom[i]-node1.top[i+r]==1||node1.top[i]-node1.bottom[i+r]==-1){node1.cost+=r;node1.count++;if(node1.top[i]-node1.bottom[i+r]==-1)    {node1.bottom[i+r]=node1.bottom[i];node1.str[i]='-';}  else{node1.bottom[i]=node1.bottom[i+r];node1.str[i+r]='-';}if(ss.find(node1.str)==ss.end())s.push(node1);node1=node2;}}}}
}
int main()
{int t;
//  freopen("in.txt","r",stdin);scanf("%d",&t);while(t--){for(int i=0;i<10;i++){int a;scanf("%d",&a);str[i]=a+'0';}str[10]='\0';printf("%d\n",bfs());}return 0;
}

hdu 1584 蜘蛛牌(bfs+set)相关推荐

  1. hdu 1584蜘蛛牌(DFS)

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

  2. HDU - 1584 蜘蛛牌

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

  3. HDU 1584 蜘蛛牌(DFS)

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

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

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

  5. HDU - 1584 蜘蛛牌 【DFS】

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

  6. HDU - 1584 蜘蛛牌(dfs+最优性剪枝)

    题目链接:点击查看 题目大意:给出10张牌,随机分布在1~10十个不同的位置,要求模拟蜘蛛纸牌的游戏规则,问移动的最短距离之和是多少 题目分析:我们可以直接dfs搜索,但需要想清楚该怎么搜索,这个题目 ...

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

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

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

    题意: 一排杂乱的牌,牌间距为1,每次移动只能将小的牌,移动到较大牌上,最终使得牌从小到大排好在一堆.问移动的最小距离. 题目: 蜘蛛牌是windows xp操作系统自带的一款纸牌游戏,游戏规则是这样 ...

  9. HDU1584 蜘蛛牌 DFS回溯

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

最新文章

  1. 从“IBM刀片服务器广告告别电视”说起
  2. Android之自定义AlertDialog的实现方法(一)
  3. Node.Js从零开始搭建数据管理后台 (一)
  4. getOutputStream() has already been called for this response异常的原因和解决方法
  5. 用户sa登陆失败 SQLServer 错误18456的解决方法
  6. SAP Spartacus 在未登录状态下浏览器 local storage 里存储的数据
  7. AutoFac+MVC+WebApi源码----我踩过的坑
  8. 会走索引吗 oracle_茅台酒会走兰花的老路吗?
  9. excel删除行 uipath_工作再忙,也要学会这10个最经典的Excel小技巧
  10. Swift3.0语法1
  11. 【语音去噪】基于matlab谱减法去噪【含Matlab源码 429期】
  12. 将excel表数据顺序与linux,Excel中表格数据进行颠倒顺序的设置方法
  13. 五大电子邮件的营销方法,教你提高客户的回头率!
  14. 通灵学院|游戏设计研习2:人类的外在人群特征★(1300字)
  15. 分享一个超好用的批量处理PPT与PPTX转换,批量删除某一页PPT,批量DOC转换为DOCX的应用
  16. java计算机毕业设计前后端分离健身房管理系统源代码+数据库+系统+lw文档
  17. 避坑指南:Kafka集群快速扩容的方案总结
  18. 家电售后APP软件开发作用特点
  19. 微信H5页面源码如何看
  20. Efficient Methods for Natural Language Processing: A Survey自然语言处理有效方法综述

热门文章

  1. 不喜欢的工作,可能通往一个崭新世界
  2. 真的能从脑电信号识别出我的情绪吗?
  3. 机械制图与计算机绘图第6章答案冯秋宫,cadcam教学图册要点.doc
  4. 中文字幕!吴恩达 ChatGPT 最新课程
  5. [Unity学习笔记:FPS游戏制作(2)] 发射子弹————(2021.6.20学习笔记)
  6. elasticsearch聚合--桶(Buckets)和指标(Metrics)的概念
  7. VS C# WinForm程序覆盖安装配置
  8. list-style-position
  9. Flash 这些知识点你知道多少?
  10. linux+唤醒windows,Linux系统与Windows系统下的网络唤醒