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;
    }



  • 相关阅读:
    slf4j中的MDC
    redis incr incrby decr decrby命令
    Java接口响应超时监控
    JDK1.7.0_45源码阅读<java.lang.Boolean>
    Debug JDK变量显形
    Java全角、半角字符的关系以及转换
    模型选择
    经验风险最小化
    支持向量机(下)
    支持向量机(上)
  • 原文地址:https://www.cnblogs.com/zhangxianlong/p/10672492.html
Copyright © 2011-2022 走看看