蜘蛛纸牌


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 蜘蛛纸牌(深度解析)的更多相关文章

  1. 《SEO深度解析——全面挖掘搜索引擎优化的核心秘密》

    <SEO深度解析——全面挖掘搜索引擎优化的核心秘密> 基本信息 作者: 痞子瑞 出版社:电子工业出版社 ISBN:9787121224041 上架时间:2014-2-28 出版日期:201 ...

  2. [WebKit内核] JavaScript引擎深度解析--基础篇(一)字节码生成及语法树的构建详情分析

    [WebKit内核] JavaScript引擎深度解析--基础篇(一)字节码生成及语法树的构建详情分析 标签: webkit内核JavaScriptCore 2015-03-26 23:26 2285 ...

  3. 第37课 深度解析QMap与QHash

    1. QMap深度解析 (1)QMap是一个以升序键顺序存储键值对的数据结构 ①QMap原型为 class QMap<K, T>模板 ②QMap中的键值对根据Key进行了排序 ③QMap中 ...

  4. Deep Learning模型之:CNN卷积神经网络(一)深度解析CNN

    http://m.blog.csdn.net/blog/wu010555688/24487301 本文整理了网上几位大牛的博客,详细地讲解了CNN的基础结构与核心思想,欢迎交流. [1]Deep le ...

  5. 一起来做webgame,《Javascript蜘蛛纸牌》

    不得不说,做游戏是会上瘾的,这次带来的是win系统上的经典游戏<蜘蛛纸牌>,不能完美,但求一玩 移牌 0 次 Javascript game_蜘蛛纸牌 正在努力加载... // " ...

  6. (转载)(收藏)OceanBase深度解析

    一.OceanBase不需要高可靠服务器和高端存储 OceanBase是关系型数据库,包含内核+OceanBase云平台(OCP).与传统关系型数据库相比,最大的不同点, 是OceanBase是分布式 ...

  7. Kafka深度解析

    本文转发自Jason’s Blog,原文链接 http://www.jasongj.com/2015/01/02/Kafka深度解析 背景介绍 Kafka简介 Kafka是一种分布式的,基于发布/订阅 ...

  8. java内存分配和String类型的深度解析

    [尊重原创文章出自:http://my.oschina.net/xiaohui249/blog/170013] 摘要 从整体上介绍java内存的概念.构成以及分配机制,在此基础上深度解析java中的S ...

  9. Unity加载模块深度解析(Shader)

    作者:张鑫链接:https://zhuanlan.zhihu.com/p/21949663来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 接上一篇 加载模块深度解析(二 ...

随机推荐

  1. 遍历tree

    1.解决方法 filterData (arr) { var newArr = [] arr.map((item) => { var childrenArr if (item.children ! ...

  2. 看过无数Java GC文章,这5个问题你也未必知道!

    看过无数Java GC文章,这6个问题你也未必知道! 读者朋友们可能已经看过太多关于Java垃圾回收相关的文章,如果没有,墙裂安利大家看下面这篇: 看完这篇垃圾回收,和面试官扯皮没问题了 本文不再重复 ...

  3. redis的批量操作命令pipeline(PHP实现)

    redis执行一条命令有四个过程:发送命令.命令排队.命令执行.返回结果:整个过程是一个往返时间(RTT).如果有n条命令,就会消耗n次RTT.Redis的客户端和服务端可能部署在不同的机器上.在两地 ...

  4. POJ 1879

    栈和队列的综合应用,利用栈和队列分别模拟分,5分,时槽,以及小球队列 利用求出一天后的置换可以求出周期,进而求出最大公约数(可以利用矩阵的角度,也许可以简化,因为每次都是乘上一个相同的置换矩阵) 要注 ...

  5. Nodejs:md5入门介绍及crypto模块的应用

    简介 MD5(Message-Digest Algorithm)是计算机安全领域广泛使用的散列函数(又称哈希算法.摘要算法),主要用来确保消息的完整和一致性.常见的应用场景有密码保护.下载文件校验等. ...

  6. Spark入门(五)--Spark的reduce和reduceByKey

    reduce和reduceByKey的区别 reduce和reduceByKey是spark中使用地非常频繁的,在字数统计中,可以看到reduceByKey的经典使用.那么reduce和reduceB ...

  7. [日志分析]Graylog2采集Nginx日志 被动方式

    graylog可以通过两种方式采集nginx日志,一种是通过Graylog Collector Sidecar进行采集(主动方式),另外是通过修改nginx配置文件的方式进行收集(被动方式). 这次说 ...

  8. Web中间件 - 常见漏洞总结

    *文章来源:https://blog.egsec.cn/archives/472 *本文将主要说明:Web中间件常见漏洞的产生原因以及修复方案 什么是Web中间件? 百度百科是这样解释的:中间件是介于 ...

  9. 直方图均衡算法(Histogram Equalized)

    Lab1: Histogram Equalization 1. 实验环境(C++) 操作系统版本 MacOS Catalina 10.15 OpenCV4.0 (imgcodecs | core | ...

  10. 动态规划-Minimum Insertion Steps to Make a String Palindrome

    2020-01-05 11:52:40 问题描述: 问题求解: 好像多次碰到类似的lcs的变种题了,都是套上了回文的壳.这里再次记录一下. 其实本质就是裸的lcs,就出结果了. public int ...