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来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 接上一篇 加载模块深度解析(二 ...
随机推荐
- 桌面运维之Windows快捷键,每一个工程师都是“快捷键”的工程师!
1.win快捷键 首先教大家win7新增的3D效果: Win + Tab 快速切换已打开的程序(和Alt+tab一样的效果) Win + Home 将所有使用中窗口以外的窗口最小化 Win + Spa ...
- 峰哥说技术:07-SpringBoot 正好Thymeleaf视图
Spring Boot深度课程系列 峰哥说技术—2020庚子年重磅推出.战胜病毒.我们在行动 07 峰哥说技术:SpringBoot 正好Thymeleaf视图 Spring Boot视图介绍 虽然 ...
- frida报错frida.InvalidArgumentError: device not found问题解决方案
一.问题描述 python安装好frida框架后,在安卓端启动了frida-server,启动要hook的应用,在cmd中执行python脚本,报错frida.InvalidArgumentE ...
- django 从零开始 6 数据库模型增删改查
这些都是凭记忆写下的,有些会漏掉,在之后的笔记中会写 和flask query不同,django是使用objects进行一个查询 查询 单条记录 django 模型.bojects.get(查询的字段 ...
- HTML5 history-hash 随机选择彩票
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...
- js 实现简易留言板功能
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 2020年启蒙及小学识字练字APP或小程序测评榜
语文教学改革后,小学识字练字方面显得越来越重要.而市场上大大小小的识字练字应用琳琅满目,不同的定位,不同的核心功能,不同的费用.应该怎么选呢? 本篇将从多个角度对主流识字练字应用进行评测,评估对象为主 ...
- MySQL语句-关于表单的操作总结(新手)
MySQl表的操作: 主键的添加: CREATE TABLE 表名(列名称 数据类型--id INT PRIMARY KEY AUTO_INCREMENT,列名称2 数据类型,············ ...
- linux环境下安装可操作图库语言Gremlin的图框架HugeGraph
原创/朱季谦 图数据库是一项比较前沿而逐渐热门的技术,是NoSql数据库的一种,它应用图形理论存储实体之间的关系信息,最主要的组成有两种,结点集和连接结点的边.常见的图数据库有Neo4j,Januas ...
- System.Text.Json 序列化对所有 JSON 属性名称使用 camel 大小写
asp.net core3.x 新增的序列号接口System.Text.Json 序列化时,如果要对所有 JSON 属性名称使用 camel 大小写 将 JsonSerializerOptions.P ...