蜘蛛牌

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

传送门

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
MY CODE:
 /*******************************

 Date    : 2015-12-06 21:05:48
Author : WQJ (1225234825@qq.com)
Link : http://www.cnblogs.com/a1225234/
Name : ********************************/
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <string>
#include <set>
#include <vector>
#include <queue>
#include <stack>
#define LL long long
using namespace std;
struct nod
{
bool f;
int s,e;
}a[];
int k;
int m=;
int minstep=;
int co=;
void dfs(int step)
{
int i,j;
if(step>minstep) return;
if(a[k].s==)
{
if(step<minstep)
minstep=step;
return;
}
for(i=;i<=;i++)
{
if(a[i].e==||a[i].f==) continue;
for(j=;j<=;j++)
{
if(a[j].f&&i!=j&&a[i].e==(a[j].s-))
{
a[j].s=a[i].s;
a[i].f=;
dfs(step+abs(i-j));
a[j].s=a[i].e+;
a[i].f=;
break;
}
}
}
return;
}
int main()
{
freopen("in.txt","r",stdin);
int T;
int i,j;
cin>>T;
while(T--)
{
minstep=;
for(i=;i<=;i++)
{
cin>>a[i].s;
a[i].e=a[i].s;
a[i].f=;
if(a[i].s==)
k=i;
}
for(i=;i<=;i++)
{
if(a[i].e==||a[i].f==) continue;
for(j=;j<=;j++)
if(a[j].f==&&i!=j&&a[i].e==(a[j].s-))
{
a[j].s=a[i].s;
a[i].f=;
dfs(abs(i-j));
a[j].s=a[i].e+;
a[i].f=;
break;
}
}
cout<<minstep<<endl;
}
return ;
}

百度的别的精简代码,数组存放的是位置,下标是牌。

 #include <iostream>
using namespace std;
int s,x[],visit[];
int cmp(int a,int b) //求绝对值
{
return a>b?a-b:b-a;
}
void dfs(int n,int step)
{
int i,j,k;
if(n==)
{
if(step<s)s=step;
return;
}
for(i=;i<;i++) //用来移动的牌
if(!visit[i])
for(j=i+;j<;j++) //移动到那个位置
{
if(!visit[j])
{
k=step+cmp(x[i],x[j]);
if(k>=s)break; //如果还没到终点就已经比先前的方案步数多,那么直接over
visit[i]=; //标记当前移动的牌已经就位了,因为i到了j的位置了,那么移动j就不管i的鸟事了
dfs(n+,k);
visit[i]=;
break;
}
}
}
int main (void)
{
freopen("in.txt","r",stdin);
int i,j,k,l,n,a;
cin>>n;
while(n--)
{
for(i=;i<;i++)
cin>>a,x[a-]=i,visit[i]=; //用x记录每个牌出现的位置
s=;
dfs(,);
cout<<s<<endl;
}
return ;
}

蜘蛛牌(hdu 1584 DFS)的更多相关文章

  1. HDU-1584 蜘蛛牌(dfs)

    可以多看看. 蜘蛛牌 Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota ...

  2. HDU1584:蜘蛛牌(DFS)

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

  3. D - 蜘蛛牌

    Time Limit:5000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Pract ...

  4. F - 蜘蛛牌(深度搜索)

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

  5. HDU1584(蜘蛛牌)

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

  6. HDU 5143 DFS

    分别给出1,2,3,4   a, b, c,d个 问能否组成数个长度不小于3的等差数列. 首先数量存在大于3的可以直接拿掉,那么可以先判是否都是0或大于3的 然后直接DFS就行了,但是还是要注意先判合 ...

  7. ACM学习历程—HDU1584 蜘蛛牌(动态规划 && 状态压缩 || 区间DP)

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

  8. Snacks HDU 5692 dfs序列+线段树

    Snacks HDU 5692 dfs序列+线段树 题意 百度科技园内有n个零食机,零食机之间通过n−1条路相互连通.每个零食机都有一个值v,表示为小度熊提供零食的价值. 由于零食被频繁的消耗和补充, ...

  9. HDU 1584:蜘蛛牌(DFS)

    http://acm.hdu.edu.cn/showproblem.php?pid=1584 题意:要让小的牌放到大的牌上面最少移动的距离. 思路:看成让大的牌放在小的牌上面了...用一个标记数组vi ...

随机推荐

  1. Keil C51处理可重入函数问题的探讨

    在程序设计中,变量具体可以分为四种类型:全局变量.静态全局变量.局部变量.静态局部变量.这几种变量类型对函数的可重入产生的重大的影响,因为不同的编译器采用不同的策略. 针对51的存储区有限,keil ...

  2. SSL和SSH和OpenSSH,OpenSSL有什么区别

    ssl是通讯链路的附加层.可以包含很多协议.https, ftps, ..... ssh只是加密的shell,最初是用来替代telnet的.通过port forward,也可以让其他协议通过ssh的隧 ...

  3. 高仿qq聊天界面

    高仿qq聊天界面,给有需要的人,界面效果如下: 真心觉得做界面非常痛苦,给有需要的朋友. chat.xml <?xml version="1.0" encoding=&quo ...

  4. 【转】linux文件系统之mount流程分析

    本质上,Ext3 mount的过程实际上是inode被替代的过程. 例如,/dev/sdb块设备被mount到/mnt/alan目录.命令:mount -t ext3 /dev/sdb /mnt/al ...

  5. java删除文件夹下所有文件

    package org.sw; import java.io.File; /** * * @author mengzw * @since 3.0 2014-2-26 */ public class D ...

  6. C++中,访问字符串的三种方法

    1.用字符数组存放一个字符串 程序1:定义一个字符数组并初始化,然后输出其中的字符串. #include<iostream> using namespace std; int main() ...

  7. 自定义 Layer 属性的动画

    默认情况下,CALayer 及其子类的绝大部分标准属性都可以执行动画,无论是添加一个 CAAnimation 到 Layer(显式动画),亦或是为属性指定一个动作然后修改它(隐式动画).   但有时候 ...

  8. Docker image 镜像介绍

    操作镜像 使用 docker 命令行操作 docker 镜像 获取镜像 使用「docker pull +镜像名称」从网络上下载image镜像 core@localhost ~ $ docker pul ...

  9. jquery css3 手机菜单动画综合版

    html <header> <a id="go-back" href="javascript:window.location.back(-1)" ...

  10. jquery 处理密码输入框(input type="password" ) 模仿placeholder

    html <form method="post" action=""> <ul> <li> <span>邮箱&l ...