zoukankan      html  css  js  c++  java
  • hdu 6171 ida*

    题意:一个数塔,类似八数码的样子。。

    思路:正解双向搜索。。时间复杂度非常科学。。不过数据弱ida*搞了过去。。。。(大力出奇迹?)

    代码;

    #include<bits/stdc++.h>
    using namespace std;
    #define X first
    #define Y second
    #define PB push_back
    #define MP make_pair
    #define MEM(x,y) memset(x,y,sizeof(x));
    #define bug(x) cout<<"bug"<<x<<endl;
    typedef long long ll;
    typedef pair<ll,ll> pii;
    using namespace std;
    pii B;
    int tim=0;
    vector<vector<int> > s;
    int diff(){
        int ret=0;
        for(int i=0;i<s.size();i++){
            for(int j=0;j<s[i].size();j++){
                if(s[i][j]!=0)
                    ret+=abs(s[i][j]-i);
            }
        }
        return ret;
    }
    int ok;
    
    void ida(int x,int y,int cnt){
        if(ok!=-1) return;
        if(cnt+diff()>tim) return;
        if(diff()==0){
            ok=cnt;
            return;
        }
        if(x-1>=0&&y-1>=0){
            swap(s[x][y],s[x-1][y-1]);
            ida(x-1,y-1,cnt+1);
            swap(s[x][y],s[x-1][y-1]);
        }
        if(x-1>=0&&y<=x-1){
            swap(s[x][y],s[x-1][y]);
            ida(x-1,y,cnt+1);
            swap(s[x][y],s[x-1][y]);
        }
        if(x+1<6&&y+1<=x+1){
            swap(s[x][y],s[x+1][y+1]);
            ida(x+1,y+1,cnt+1);
            swap(s[x][y],s[x+1][y+1]);
        }
        if(x+1<6){
            swap(s[x][y],s[x+1][y]);
            ida(x+1,y,cnt+1);
            swap(s[x][y],s[x+1][y]);
        }
    }
    
    int main() {
        int t;
        for(int i=1;i<=6;i++)
            s.PB(vector<int>(i));
        scanf("%d",&t);
        while(t--){
    
            int x,y;
            for(int i=1;i<=6;i++){
                for(int j=0;j<i;j++){
                    scanf("%d",&s[i-1][j]);
                    if(s[i-1][j]==0){
                        x=i-1;y=j;
                    }
                }
            }
            ok=-1;
            tim=diff();
            int cnt=0;
            while(1){
                ida(x,y,0);
                tim++;
                if(tim>20) break;
                if(ok!=-1) break;
            }
            if(ok!=-1)printf("%d
    ",ok);
            else puts("too difficult");
        }
        return 0;
    }



  • 相关阅读:
    Google官方教程之Selling In-app Products
    In-app Billing 概述
    Android SDK和ADT无法更新的解决办法
    在NGUI中高效优化UIScrollView之UIWrapContent的简介以及使用
    cocos2d-x 3.1 编译脚本android-build.py
    Storm---DirectGroup(直接分组)
    Lucene Spatial构建地理空间索引
    Log4j2日志配置
    Guava缓存使用
    Maven 多套环境配置
  • 原文地址:https://www.cnblogs.com/zhangxianlong/p/10672492.html
Copyright © 2011-2022 走看看