蜘蛛牌(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 ...
随机推荐
- linq学习三个实例
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- EF查询
public ActionResult AllSettings(DataSourceRequest command, Framework.Kendoui.Filter filter = null, S ...
- ubuntu 执行apt-get update 提示无法获得锁
问题如下: y@y:~$ sudo apt-get updateE: 无法获得锁 /var/lib/apt/lists/lock - open (11: 资源暂时不可用)E: 无法对目录 /var/l ...
- KEIL 程序定位
用Keil做51的开发也4年多了,代码量基本上维持在5~10K左右,说大不大,说小也不小,也就是个中等货色.这段期间工作上难得有稍许的空间,潜心研究了一下keil中如何在 CODE中定位C程序的方法. ...
- KEIL里 Volatile的用法
volatile用于防止相关变量被优化. 例如对外部寄存器的读写.对有些外部设备的寄存器来说,读写操作可能都会引发一定硬件操作,但是如果不加volatile,编译器会把这些寄存器作为普通变量处理,例如 ...
- 如何向投资人展示——How to Present to Investors
著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处.作者:茶叶末链接:http://www.zhihu.com/question/23638879/answer/34525204来源: ...
- mybatis源代码分析:mybatis延迟加载机制改进
在上一篇博客<mybatis源代码分析:深入了解mybatis延迟加载机制>讲诉了mybatis延迟加载的具体机制及实现原理. 可以看出,如果查询结果对象中有一个属性是需要延迟加载的,那整 ...
- bzoj1755 [Usaco2005 qua]Bank Interest
Description Farmer John made a profit last year! He would like to invest it well but wonders how muc ...
- Python 异步IO、IO多路复用
事件驱动模型 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UT ...
- Python多线程(threading模块)
线程(thread)是操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位.一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务. ...