• HDOJ1584蜘蛛牌【DFS】


    10张牌,大的只能跟小的跑,可以针对每一个状态进行搜索,求一个最小的移动距离。
    但是不会怎么遍历整个状态是硬伤?
    因为只能大的跟着小的。
    先把小的标记,去寻找大的点,最终一定是满足的吧。
    比如先标记1,然后回溯的时候,2被标记了,那么一定是放到比2大一的3上,这样一定是满足的。
    不会DFS全部的情况是硬伤啊!!!

    #include <bits/stdc++.h>
    using namespace std;
    typedef long long LL;
    typedef unsigned long long ULL;
    const double eps=1e-5;
    const double pi=acos(-1.0);
    const int mod=1e9+7;
    const int INF=0x3f3f3f3f;
    const int N=1e5+10;
    
    int a[15],vis[15];
    int ans;
    
    void dfs(int cur,int temp)
    {
        if(temp>=ans){
            return;
        }
        if(cur==9){         //10是不会动的,动9张就行
            ans=temp;
            return;
        }
        for(int i=1;i<10;i++){          //所有情况的DFS
            if(!vis[i]){
                for(int k=i+1;k<=10;k++){       //放的肯定比他的大
                    if(!vis[k]){
                        vis[i]=1;
                        dfs(cur+1,temp+abs(a[i]-a[k]));     
                        break;                  //放完就结束。
                    }
                }
                vis[i]=0;       //回溯
            }
        }
    }
    
    int main()
    {
        int T,i;
        scanf("%d",&T);
        while(T--)
        {
            int x;
            for(i=1;i<=10;i++){
                cin>>x;
                a[x]=i;
            }
            memset(vis,0,sizeof(vis));
            ans=INF;
            dfs(0,0);
            cout<<ans<<endl;
        }
        return 0;
    }
    
  • 相关阅读:
    微信H5跳转到小程序
    对比React的hooks与Vue的composition
    H5网页在ios,android,微信中打开手机中的地图导航
    MySQL学习笔记(一)
    Matlab学习笔记(五)
    Matlab学习笔记(四)
    Matlab学习笔记(三)
    Matlab学习笔记(二)
    Matlab学习笔记(一)
    Python学习笔记(四)
  • 原文地址:https://www.cnblogs.com/keyboarder-zsq/p/5934440.html
Copyright © 2020-2023  润新知