hdu 6171 ida*

来源:互联网 发布:c语言为什么叫c语言 编辑:程序博客网 时间:2024/05/20 09:08

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

思路:正解双向搜索。。时间复杂度非常科学。。不过数据弱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;}