蜘蛛牌(hdu 1584 DFS)
蜘蛛牌
Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2358 Accepted Submission(s):
1012
传送门
xp操作系统自带的一款纸牌游戏,游戏规则是这样的:只能将牌拖到比她大一的牌上面(A最小,K最大),如果拖动的牌上有按顺序排好的牌时,那么这些牌也跟着一起移动,游戏的目的是将所有的牌按同一花色从小到大排好,为了简单起见,我们的游戏只有同一花色的10张牌,从A到10,且随机的在一行上展开,编号从1到10,把第i号上的牌移到第j号牌上,移动距离为abs(i-j),现在你要做的是求出完成游戏的最小移动距离。
每组数据有一行,10个输入数据,数据的范围是[1,10],分别表示A到10,我们保证每组数据都是合法的。
1 2 3 4 5 6 7 8 9 10
/******************************* 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)的更多相关文章
- HDU-1584 蜘蛛牌(dfs)
可以多看看. 蜘蛛牌 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
- HDU1584:蜘蛛牌(DFS)
Problem Description 蜘蛛牌是windows xp操作系统自带的一款纸牌游戏,游戏规则是这样的:只能将牌拖到比她大一的牌上面(A最小,K最大),如果拖动的牌上有按顺序排好的牌时,那么 ...
- D - 蜘蛛牌
Time Limit:5000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Status Pract ...
- F - 蜘蛛牌(深度搜索)
Problem Description 蜘蛛牌是windows xp操作系统自带的一款纸牌游戏,游戏规则是这样的:只能将牌拖到比她大一的牌上面(A最小,K最大),如果拖动的牌上有按顺序排好的牌时,那么 ...
- HDU1584(蜘蛛牌)
蜘蛛牌 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- HDU 5143 DFS
分别给出1,2,3,4 a, b, c,d个 问能否组成数个长度不小于3的等差数列. 首先数量存在大于3的可以直接拿掉,那么可以先判是否都是0或大于3的 然后直接DFS就行了,但是还是要注意先判合 ...
- ACM学习历程—HDU1584 蜘蛛牌(动态规划 && 状态压缩 || 区间DP)
Description 蜘蛛牌是windows xp操作系统自带的一款纸牌游戏,游戏规则是这样的:只能将牌拖到比她大一的牌上面(A最小,K最大),如果拖动的牌上有按顺序排好的牌时,那么这些牌也跟着一起 ...
- Snacks HDU 5692 dfs序列+线段树
Snacks HDU 5692 dfs序列+线段树 题意 百度科技园内有n个零食机,零食机之间通过n−1条路相互连通.每个零食机都有一个值v,表示为小度熊提供零食的价值. 由于零食被频繁的消耗和补充, ...
- HDU 1584:蜘蛛牌(DFS)
http://acm.hdu.edu.cn/showproblem.php?pid=1584 题意:要让小的牌放到大的牌上面最少移动的距离. 思路:看成让大的牌放在小的牌上面了...用一个标记数组vi ...
随机推荐
- 用php理解指针--写给刚刚学习编程的人
在刚刚学习编程时,可能for循环什么的还是可以理解,但是当学习到指针的时候,课上估计很多人就睡觉去了. 现在用两端php程序说明指针 先写一个简单的,大家都理解下 <?php class tex ...
- BZOJ 1070 修车(最小费用流)
链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1070 同一时刻有N位车主带着他们的爱车来到了汽车维修中心.维修中心共有M位技术人员,不同的技术 ...
- Spring使用小结2
之前做过不少spring想过知识点内容的摘录, Spring框架的特点.模块组成.优缺点 spring相关的bean管理想过知识点及依赖注入方式 今天说下近端时间中项目中遇到的相关印象比较深的知识点 ...
- 网站10大致命SEO错误
1.关键字堆砌 我想不出有比胡乱将这些复制的内容放在网站上更差劲的事情了.网站复制一遍又一遍,你肯定也不想看到这么差劲的网站复制. 你在明白我在做什么吗?我并不是一个那么差劲的编辑者,我只是想说明一个 ...
- [转]jQuery EasyUI 扩展-- 主题(Themes)
主题(Themes)允许您改变站点的外观和感观.使用主题可以节省设计的时间,让您腾出更多的时间进行开发.您也可以创建一个已有主题的子主题. 主题生成器(Theme Builder) jQuery UI ...
- POJ 1631 Bridging signals DP(最长上升子序列)
最近一直在做<挑战程序设计竞赛>的练习题,感觉好多经典的题,都值得记录. 题意:给你t组数据,每组数组有n个数字,求每组的最长上升子序列的长度. 思路:由于n最大为40000,所以n*n的 ...
- 漫谈linux文件IO
在Linux 开发中,有几个关系到性能的东西,技术人员非常关注:进程,CPU,MEM,网络IO,磁盘IO.本篇文件打算详细全面,深入浅出.剖析文件IO的细节.从多个角度探索如何提高IO性能.本文尽量用 ...
- AFN的二次封装
http://www.cnblogs.com/sxwangjiadong/p/4970751.html
- 一步一步学数据结构之n--n(Prim算法)
在这里说下最小连通网的Prim算法: 而Kruskal算法,http://blog.csdn.net/nethanhan/article/details/10050735有介绍,大家可以去看下! Pr ...
- [Hapi.js] Managing State with Cookies
hapi has built-in support for parsing cookies from a request headers, and writing cookies to a respo ...