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\n",ok);
        else puts("too difficult");
    }
    return 0;
}



 

posted @ 2017-08-26 20:51  zhangxianlong  阅读(147)  评论(0编辑  收藏  举报