• P1379 八数码难题


    题目描述

    在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字。棋盘中留有一个空格,空格用0来表示。空格周围的棋子可以移到空格中。要求解的问题是:给出一种初始布局(初始状态)和目标布局(为了使题目简单,设目标状态为123804765),找到一种最少步骤的移动方法,实现从初始布局到目标布局的转变。

    输入输出格式

    输入格式:

    输入初试状态,一行九个数字,空格用0表示

    输出格式:

    只有一行,该行只有一个数字,表示从初始状态到目标状态需要的最少移动次数(测试数据中无特殊无法到达目标状态数据)

    输入输出样例

    输入样例#1:
    283104765
    
    输出样例#1:
    4
    不得不说,这个题,太恶心了。但必须要做。
    为了简化,我们把整个棋盘压缩为一个数,难处理了但是不会爆。
    #include<iostream>
    #include<cstdio>
    #include<math.h>
    #include<algorithm>
    #include<queue>
    using namespace std;
    struct node{int s;int l;int ans;}; 
    bool ss[88888888];
    int n,mb=123804765;
    int p[9]={100000000,10000000,1000000,100000,10000,1000,100,10,1};
    int xx[5]={-1,3,-3,1};
    queue<node>q;
    void bfs()
    {
        ss[n/10]=1;
        while(!q.empty())
        {        
            node x=q.front();
            if(x.s == mb)
            {
                printf("%d",x.ans);
                return ;
            }
            
            q.pop();
            for(int i=0;i<=3;i++)
            {
                int x2=x.l+xx[i];
                int j=x.l;
                if(x2>8||x2<0)    continue;
                if(j%3==2&&xx[i]==1)    continue;
                if(j%3==0&&xx[i]==-1)    continue;
                
                int t=(x.s/p[x2])%10;
                int tt=(x.s/p[j]+t)*p[j]+x.s%p[j];
                tt=tt/p[x2]/10*10*p[x2]+tt%p[x2];
                if(!ss[tt/10])
                {
                    ss[tt/10]=1;
                    node o;o.s=tt,o.l=x2,o.ans=x.ans+1;
                    q.push(o);
                }
            }
        }
    }
    int main()
    {
        scanf("%d",&n);
        int ww=n,t=8;
        while(ww)
        {
            if(ww%10 == 0)    break;
            t--;
            ww/=10;
        }
        node o;
        o.s=n,o.l=t,o.ans=0;
        q.push(o);
        bfs();
        return 0;
    }
  • 相关阅读:
    【poj2396】 Budget
    【bzoj3876】 Ahoi2014—支线剧情
    【uoj207】 共价大爷游长沙
    【bzoj3064】 CPU监控
    【codeforces 103E】 Buying Sets
    【bzoj3938】 Robot
    【bzoj1568】 JSOI2008—Blue Mary开公司
    【hdu5306】 Gorgeous Sequence
    【bzoj2229】 Zjoi2011—最小割
    【bzoj2007】 Noi2010—海拔
  • 原文地址:https://www.cnblogs.com/CLGYPYJ/p/7308801.html
Copyright © 2020-2023  润新知