• 蜘蛛牌


    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
     


     

    题意:小牌叠在大牌上,问叠成一堆的最小移动距离

    思路:将所有状况进行一次DFS,并找到移动距离最小的最优解ans,一旦大于ans立刻返回,回溯到上一种情况

    2 3 4 6 9 8 7 1 5 10
    有点类似于汉诺塔的递推思想
    从后往前推,把问题变小:
    假设此时,1到8全在8的下面,还有9,10单独这时有两种方法:一,把8放在
    9的下面,再把9放到10的下面;二,把9放到10的下面,再把8放到9的下面。
    类似的,再往前回溯一步:1到7,8,9,10,这时有6种情况(可以选择先动
    1到7或8或9,每种情况对应2种情况,2+2+2=6)
    依次类推。

     1 #include <stdio.h>
     2 #include <string.h>
     3 
     4 int a[15],vis[15],ans;
     5 
     6 int abs(int x)
     7 {
     8     if(x<0)
     9     return -x;
    10     return x;
    11 }
    12 
    13 void dfs(int cnt,int sum)
    14 {
    15     int i,j;
    16     if(sum>=ans)
    17     return ;
    18     if(cnt == 9)
    19     {
    20         ans = sum;
    21         return ;
    22     }
    23     for(i = 1;i<10;i++)
    24     {
    25         if(!vis[i])
    26         {
    27             vis[i] = 1;
    28             for(j = i+1;j<=10;j++)
    29             {
    30                 if(!vis[j])
    31                 {
    32                     dfs(cnt+1,sum+abs(a[i]-a[j]));
    33                     break;
    34                 }
    35             }
    36             vis[i] = 0;
    37         }
    38     }
    39 }
    40 
    41 int main()
    42 {
    43     int t,i,x;
    44     scanf("%d",&t);
    45     while(t--)
    46     {
    47         for(i = 1;i<=10;i++)
    48         {
    49             scanf("%d",&x);
    50             a[x] = i;//牌面为x的牌在第i个位置
    51         }
    52         memset(vis,0,sizeof(vis));
    53         ans = 10000000;
    54         dfs(0,0);
    55         printf("%d
    ",ans);
    56     }
    57 
    58     return 0;
    59 }
    View Code
  • 相关阅读:
    C版程序语法 (消除左递归)
    文法
    201506110248 实验报告
    组合数据类型
    UBUNTU四种版本的区别【转】
    MFC对话框程序屏蔽回车与ESC键,Tab键
    std::fstream打开中文路径名失败的问题原因、解决方法以及注意事项
    前进。。。。。。
    程序员学习能力提升三要素[转]
    java学习推荐资源
  • 原文地址:https://www.cnblogs.com/to-creat/p/4996797.html
Copyright © 2020-2023  润新知