• hdu3567Eight II(八数码,IDA*)


    题目链接

    题意

    八数码问题,不过目标状态不定,保证有解

    解题思路

    和上一题类似,先算一下目标状态在跑IDA*即可,剪枝条件与上一题相同
    参考

    AC代码

    #include<vector>
    #include<algorithm>
    #include<cstdio>
    #include<iostream>
    #include<set>
    #include<cstring>
    #include<functional>
    #include<map>
    #include<cmath>
    #include<string>
    #include<queue>
    using namespace std;
    typedef long long ll;
    typedef pair<int,int> pii;
    typedef pair<int,pii> PII;
    const int maxn = 1e6+5;
    int goal[10][2];
    int G[10][10];
    int dx[] = {1,0,0,-1};
    int dy[] = {0,-1,1,0};
    char dir[] = {'d','l','r','u'};
    
    int manhattan()
    {
        int sum = 0;
        for(int i=0;i<3;i++){
            for(int j=0;j<3;j++){
                int w = G[i][j];
                if(w==0)continue;
                sum += abs(goal[w][0] - i) + abs(goal[w][1] - j);
            }
        }
        return sum;
    }
    char sta[500];
    bool flag = 0;
    void idastar(int x,int y,int pre,int step,int top)
    {
        if(flag)return;
        for(int i=0;i<4;i++){
            if(flag)return;
            int nx = x + dx[i];
            int ny = y + dy[i];
            if(nx > 2||ny>2||nx < 0||ny<0)continue;
            if(pre + i == 3)continue;
            swap(G[x][y],G[nx][ny]);
            int mht = manhattan();
            if(mht==0){
                cout << step+1 << endl;
                sta[step] = dir[i];
                cout << sta << endl;
                flag = 1;
                return;
            }
            if(mht + step <= top){
                if(flag) return;
                sta[step] = dir[i];
                idastar(nx,ny,i,step+1,top);
            }
            swap(G[x][y],G[nx][ny]);
        }
    }
    
    int main(int argc, char const *argv[])
    {
        int T = 0;
        cin >> T;
        int Case = 1;
        while(T--){
            memset(sta,0,sizeof(sta));
            string s1,s2;
            cin >> s1 >> s2;
            cout << "Case " << Case++ << ": ";
            if(s1==s2){
                cout << "0" << endl;
                cout <<endl;
                continue;
            }
            flag = 0;
            int bx,by;
            for(int i=0;i<s1.length();i++){
                if(s1[i]=='X'){
                    G[i/3][i%3] = 0;
                    bx = i/3;
                    by = i%3;
                }else{
                    G[i/3][i%3] = s1[i]-'0';
                }
            }
            for(int i=0;i<s2.length();i++){
                int w = 0;
                if(s2[i]=='X'){
                    w = 0;
                }else{
                    w = s2[i]-'0';
                }
                goal[w][0] = i/3;
                goal[w][1] = i%3;
            }
            int top = 0;
            while(++top){
                idastar(bx,by,-1,0,top);
                if(flag)
                    break;
            }
        }
        
        return 0;
    }
    
  • 相关阅读:
    linux下内存检测工具valgrind
    c语言可变参数与宏定义
    rabbitmq学习之路-rabbitmqctl
    linux/mac下命令行rm回收站--rmtrash
    Python之路【第十一篇】: 进程与线程理论篇
    Python之路【第十一篇】: 进程与线程
    Git常用命令
    Python之路【第十篇】: python基础之socket编程
    Python之路【第九篇】:面向对象进阶
    Python之路【第八篇】:面向对象的程序设计
  • 原文地址:https://www.cnblogs.com/django-lf/p/9786590.html
Copyright © 2020-2023  润新知