zoukankan      html  css  js  c++  java
  • hdu 1584 蜘蛛纸牌 搜索 分治 动态规划

    搜索

    http://acm.hdu.edu.cn/showproblem.php?pid=1584

     枚举每张未移动的牌 移动到后面的第一张未移动的牌上去 比如要移动1 而 2  3  4 都移动过了 就把1移动到 5上去 因为 2 3 4 一定都移动到了 5上面

    #include<iostream>
    #include<string.h>
    #include<math.h>
    using namespace std;
    int a[12],vis[12],min1;

    void dfs(int cur,int temp)
    {
        int i,j;
        if(temp>=min1)   
            return ;    //剪枝 相当重要 没有很容易超时
        if(cur==9)    //十张牌只要移动九次就可以了
        {
            min1=temp;
            return ;
        }
        for(i=1;i<10;i++)  //第cur次移动  移动i牌
            if(!vis[i])
            {
                for(j=i+1;j<=10;j++)
                    if(!vis[j])
                    {
                        vis[i]=1;
                        dfs(cur+1,temp+abs(a[i]-a[j]));
                        break;
                    }
                vis[i]=0;
            }
            return ;
    }

    int main()
    {
        int i,t,c;
        scanf("%d",&t);
        while(t--)
        {
            for(i=1;i<=10;i++)
            {
                scanf("%d",&c);  //牌c 在位置i 处
                a[c]=i;
            }
            min1=100000;
            memset(vis,0,sizeof(vis));
            dfs(0,0);
            printf("%d\n",min1);
        }
        return 0;
    }

    分治

    动态规划

  • 相关阅读:
    dfa最小化,终于完成了。
    nfa转dfa,正式完成
    正则转nfa:完成
    正则转nfa:bug消除
    myeclipse集成jad反编译步骤
    CSS声明 列表样式 显示方式 鼠标形状
    CSS声明2 定位
    CSS声明1
    CSS基础知识简介
    lol简介/html
  • 原文地址:https://www.cnblogs.com/assult/p/3052178.html
Copyright © 2011-2022 走看看