「 Luogu P1379 」 八数码难题

本文介绍了一种使用BFS算法解决八数码问题的方法,通过将棋盘状态压缩为整数并利用set进行判重,有效提高了搜索效率。

# 解题思路

这题不难,主要就是考虑如何判重,如果直接在 $9$ 个位置上都比较一遍的话。你会得到下面的好成绩

所以考虑另一种方法:

将九个位置压成一个整数,并且因为只有九个数,所以不会超出 $int$,用 $set$ 判重,写一个 BFS 就过了

 

# 附上代码

#include<iostream>
#include<cstdio>
#include<queue>
#include<set>
using namespace std;
struct node{
    int map,zerox,zeroy,step;
};
int pos=123804765;
queue<node>P;
set<int>S;
int dx[7]={0,0,1,-1};
int dy[7]={1,-1,0,0};
void bfs(node now)
{
    while(!P.empty())
    {
        node now=P.front();
        P.pop();
        int map=now.map,x=now.zerox,y=now.zeroy,step=now.step;
        if(map==pos)
        {
            printf("%d",step);
            return ;
        }
        int nxt[5][5],k=map;
        for(int i=0;i<4;i++)
        {
            int xx=dx[i]+x,yy=dy[i]+y;
            if(xx>0&&xx<4&&yy>0&&yy<4)
            {
                k=map;
                for(int i=3;i>=1;i--)
                    for(int j=3;j>=1;j--)
                        nxt[i][j]=k%10,k/=10;
                nxt[x][y]=nxt[xx][yy],nxt[xx][yy]=0;
                int ps=0,h[15],o[15];
                for(int i=1;i<=3;i++)
                    for(int j=1;j<=3;j++)
                        ps=ps*10+nxt[i][j],h[nxt[i][j]]=i,o[nxt[i][j]]=j;
                if(!S.count(ps))
                {
                    S.insert(ps);
                    P.push((node){ps,h[0],o[0],step+1});
                }
            }
        }
    }
}
int main()
{
    char p;
    int m=0,x0,y0;
    //scanf("%d",m);
    for(int i=1;i<=3;i++)
    {
        for(int j=1;j<=3;j++)
        {
            cin>>p;
            m=(p-'0')+m*10;
            if(p=='0') x0=i,y0=j;
        }
    }
    S.insert(m);
    P.push((node){m,x0,y0,0});
    bfs(P.front());
}

 

转载于:https://www.cnblogs.com/bljfy/p/9625572.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值