DFS 蜘蛛纸牌(深度解析)
蜘蛛纸牌
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
***(
思路如下:
这一题 我们可以的 pos_card[],去存储 每张牌的位置,然后我们通过深搜 去遍历每一种 符合题意的移动的情况(理解不通直接看代码)。
题解如下:
#include<iostream>
#include<string.h>
#include<cstdlib>
using namespace std;
int pos_card[15]; //用来存储某张牌的位置
int mark[15]; //用来做标记用的,
int min_sum; //用来记录最小的移动距离
void dfs(int k,int sum) //进行了k次对牌的移动操作,最当前小移动距离为sum
{
if(sum >= min_sum) //进行剪枝操作,如果当前最小移动距离sum 已经大于 之前 移动9张所用的最小移动的距离min_sum
return; //此时 这种深的情况 就没必要进行下去了
if(k == 9) //这里 k==9 时就可以 就有一种方案出现了,因为 已经把 移动了九张牌的位置放好了(10这张牌不可以被移动,所以只需要移动九张牌)
{
min_sum = sum;
}
for(int i=1;i<10;i++) //这里的 i 表示是牌上的数字(就是要被 移动的牌)
{
if(! mark[i]) //mark[i]=0 说明这张牌没有被移动过,那我们就可先选择 移动这张牌
{
mark[i] = 1; //设标记,表明该牌已经被移动过了,不能在被移到东了
for(int j=i+1;j<=10;j++) //这里的 j 表示 ,将i这张牌移动到 j 这张牌的上面(这里 有点难理解为什么是 “把i这张牌移到j牌上”,我们可能会想万一 j>i+1 ,这个时候 该次移动操作就不符合“把牌移到比她大1的牌上”的规则吗,)
{ //不必这样担心,因为如果 j>i+1,我们在这里假设 i = 2 ,j = 6 ;j为6说明 i=3,i=4,i=5 这三张牌已经被移动过了(因为此时的mark[3~5]=1,mark[6]=0),而且一定是这三张牌已经依照规则 先被移动到 6这张牌上面(这点一定要搞明白),
//此时 i这张牌要想有最小的位移 只能 被移到 6 这张牌的上面(因为在6这张牌的最上面为3这张牌)
if(! mark[j]) // mark[j] 为0 说明这张牌没有被移动过,知识又可能 有其他的牌移动到 这张牌的上面
{
dfs(k+1,sum+abs(pos_card[i] - pos_card[j]));
break; //这里的 break 也需要理解,这里的理解是 只要 i 这张牌 找到 一个 第一个放置位置,就不用再找放置位置了
}
}
mark[i] = 0; //回溯清除标记,进行下一种情况的尝试(这个需要自己理解)
}
}
}
int main()
{
int t;
cin>>t;
while(t--)
{
memset(mark,0,sizeof(mark));
min_sum = 1e9;
for(int i=1;i<=10;i++)
{
int temp;
cin>>temp;
pos_card[temp] = i; //pos_card[3] = 5; 3号牌的位置为5
}
dfs(0,0);
cout<<min_sum<<endl;
}
return 0;
}
DFS 蜘蛛纸牌(深度解析)的更多相关文章
- 《SEO深度解析——全面挖掘搜索引擎优化的核心秘密》
<SEO深度解析——全面挖掘搜索引擎优化的核心秘密> 基本信息 作者: 痞子瑞 出版社:电子工业出版社 ISBN:9787121224041 上架时间:2014-2-28 出版日期:201 ...
- [WebKit内核] JavaScript引擎深度解析--基础篇(一)字节码生成及语法树的构建详情分析
[WebKit内核] JavaScript引擎深度解析--基础篇(一)字节码生成及语法树的构建详情分析 标签: webkit内核JavaScriptCore 2015-03-26 23:26 2285 ...
- 第37课 深度解析QMap与QHash
1. QMap深度解析 (1)QMap是一个以升序键顺序存储键值对的数据结构 ①QMap原型为 class QMap<K, T>模板 ②QMap中的键值对根据Key进行了排序 ③QMap中 ...
- Deep Learning模型之:CNN卷积神经网络(一)深度解析CNN
http://m.blog.csdn.net/blog/wu010555688/24487301 本文整理了网上几位大牛的博客,详细地讲解了CNN的基础结构与核心思想,欢迎交流. [1]Deep le ...
- 一起来做webgame,《Javascript蜘蛛纸牌》
不得不说,做游戏是会上瘾的,这次带来的是win系统上的经典游戏<蜘蛛纸牌>,不能完美,但求一玩 移牌 0 次 Javascript game_蜘蛛纸牌 正在努力加载... // " ...
- (转载)(收藏)OceanBase深度解析
一.OceanBase不需要高可靠服务器和高端存储 OceanBase是关系型数据库,包含内核+OceanBase云平台(OCP).与传统关系型数据库相比,最大的不同点, 是OceanBase是分布式 ...
- Kafka深度解析
本文转发自Jason’s Blog,原文链接 http://www.jasongj.com/2015/01/02/Kafka深度解析 背景介绍 Kafka简介 Kafka是一种分布式的,基于发布/订阅 ...
- java内存分配和String类型的深度解析
[尊重原创文章出自:http://my.oschina.net/xiaohui249/blog/170013] 摘要 从整体上介绍java内存的概念.构成以及分配机制,在此基础上深度解析java中的S ...
- Unity加载模块深度解析(Shader)
作者:张鑫链接:https://zhuanlan.zhihu.com/p/21949663来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 接上一篇 加载模块深度解析(二 ...
随机推荐
- C++常数优化
#pragma GCC optimize(2) #pragma GCC optimize(3) #pragma GCC target("avx") #pragma GCC opti ...
- R|生存分析 - KM曲线 ,值得拥有姓名和颜值
本文首发于“生信补给站”:https://mp.weixin.qq.com/s/lpkWwrLNtkLH8QA75X5STw 生存分析作为分析疾病/癌症预后的出镜频率超高的分析手段,而其结果展示的KM ...
- node打开本地应用程序
1.打开浏览器 最简单的方法: const cp = require('child_process') cp.exec('start http://127.0.0.1:8889/'); // 自动打开 ...
- 【03】openlayers 地图事件
绑定事件:map.on(type, listener) 取消绑定:map.un(type, listener) type:事件类型 listener:执行得函数体 事件类型: //事件类型 let t ...
- 使用MySql对IdentityServer4进行持久化
哈喽大家好,看见网上很少有使用MySql进行持久化的,毕竟又很多坑,说句实话,就连 MySql.Data.EntityFrameworkCore 都有问题,不知道是.net core更新太快还是其它的 ...
- LSTM + linear-CRF序列标注笔记
CRF 许多随机变量组成一个无向图G = {V, E},V代表顶点,E代表顶点间相连的边, 每个顶点代表一个随机变量,边代表两个随机变量间存在相互影响关系(变量非独立), 如果随机变量根据图的结构而具 ...
- oracle中的创建过程,函数,包
一.创建存储过程 存储过程是在oracle中存取完成特定业务逻辑的代码块.存储过程是命名块,匿名块不存在数据库中,命名块会存储到数据库中,匿名块每次运行都需要提前编译,命名块一次存储,只会编译一次.命 ...
- Apex_1. 解决“违反主键约束性”
1.有创建序列号的可以把序列号调到当前记录ID的最大值+1: 2.进入系统文件system.properties,找到下面代码,把system.id.generator.type的值改为1: #系统默 ...
- 3. webdriver的常用方法
WebDriver常用方法: clear(): 清除文本. send_keys (value): 模拟按键输入. click(): 单击元素. submit():用于提交表单 from seleniu ...
- 基于 HTML5 WebGL 与 GIS 的智慧机场大数据可视化分析【转载】
前言:大数据,人工智能,工业物联网,5G 已经或者正在潜移默化地改变着我们的生活.在信息技术快速发展的时代,谁能抓住数据的核心,利用有效的方法对数据做数据挖掘和数据分析,从数据中发现趋势,谁就能做到精 ...