HDU1584蜘蛛牌

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

#include 
     
     
      
      
#include 
      
      
       
       
#include 
       
       
        
        
int ans;
int a[11];
int pd[11];
using namespace std;
int abs(int x)
{
    if(x < 0)
        return -x;
    return x;
}
void dfs(int num, int sum)//num是移动了的数据的个数,sum是目前已经移动的总距离
{
    //ans是移动总次数的最小值,目前的sum就已大于上一个全部移动后的总次数则不必移动,直接return
    if(sum >= ans)
        return;
     //有九个数据已经移动了,说明已经完成   
    if(num == 9)
    {
        //已经判断过sun是小于ans的了,所以这种移动方式的总移动次数为sum,并且小于之前保持的ans
        ans = sum;
        return;
    }
    for(int i = 1; i <= 9; i++)
    {
        //如果i没有被移动过,则移动i到其他数据上
        if(!pd[i])
        {
            pd[i] = 1;//选定要移动的项,将要移动
            for(int j = i + 1; j <= 10; j++)
            {
                if(!pd[j])//移动到为移动过的j上
                {
                    //1要移动到2上,如果2被移动过说明,2在3上,所以1要移动到3上
                    dfs(num + 1, sum + abs(a[j] - a[i]));
                    break;
                }
            }
            //例如假设先移动的1.现在换另一种方案,先移动2,一开始已经被标记过移动的1也要取消标记
            //就是从最先移动1变为先移动2变为3变为4的过程
            pd[i] = 0;
        }
    }
}
int main()
{
    int t;
    while(scanf("%d", &t) != EOF)
    {
        while(t--)
        {
            for(int i = 1; i <= 10; i++)
            {
                int x;
                scanf("%d",&x);
                a[x] = i;//a[x]记录数字x的位置
            }
            memset(pd, 0, sizeof(pd));
            ans = 10000000;
            dfs(0, 0);
            printf("%d\n", ans);
        }

    }
    return 0;
}

       
       
      
      
     
     

蜘蛛游戏• 授权方式:免费源码 • 运行环境:SDK • 源码大小:800 KB • 开发厂商:Home Page • 整理时间:2006-02-27 • 下载统计:19421 • 推荐等级: 版本:1.1.0作者:dujid 说明:http://pub.idr.gov.cn/dujid/projects/araneid---------------------运行 Araneid---------------------对于源文件下载包:1. 下载一个Java开发库,例如 J2sdk1.4.2 等版本,http://java.sun.com/ 上有;2. 编译所有的源文件;3. 复制 images 目录到程序运行目录,如果目录放置错误,程序会没有图像显示;4. 运行 dujid.araneid.Araneid(默认) 。对于发布包:1. 下载一个Java运行时,例如 J2re1.4.2 等版本,http://java.sun.com/ 上有;2. 执行 classes 目录中的 start.bat---------------------对于开发者---------------------程序在 Windows XP J2sdk 1.3 下开发,使用编辑器 JCreator 2.5 Pro源目录(src)中 araneid.jcw 是 JCreator 的工作空间文件。后来在 J2sdk1.4.2 下修正,使用编辑器 Intellij IDEA源目录(src)中 araneid.ipr 和 araneid_old.ipr 分别是 Intellij IDEA 3 和 Intellij IDEA 4 的工程文件。软件介绍“蜘蛛”游戏的目标是以最少的移动次数将十叠中所有最前面的都移走。 如要将十叠中所有最前面的都移走,请将从一列移到另一列,直到将一套从 K 到 A 依次排齐。当一组从 K 到 A 依次排齐时,这些就会被移走。 蜘蛛玩法 在“游戏”菜单上,单击“开局”。 “蜘蛛”用两副玩。新一局游戏开始时,发有十叠,每叠中只有一张正面朝上。其余的放在窗口右下角的五叠叠中;新一轮发时用这些。 移的方法是将从一个叠拖到另一个叠。移的规则如下: 可以将叠最底下的移到空叠。 可以将叠最底下移到值仅次于它的上,不论套或颜色如何。 可以像对待一张一样移动一组同样套、依序排好的。 准备新一轮发时,请单击“发”,或者单击窗口右下角的叠。 在新一轮发之前,每一叠中都必须有
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值