八数码

八数码,BFS模板题,不做人生不完整

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <set>
using namespace std;
const int maxn = 1000000;

typedef int State[9];

State que[maxn];
State goal;
int dist[maxn];

int vis[362880],fact[9]; 
void init_lookup_table(){
    fact[0]=1;
    for(int i=1;i<9;i++) fact[i]=fact[i-1]*i;
}
//康托展开 
int try_to_insert(int s){
    int code=0;
    for(int i=0;i<9;i++){
        int cnt=0;
        for(int j=i+1;j<9;j++)  if(que[s][i]>que[s][j]) cnt++;
        code+=fact[8-i]*cnt;
    }
    if(vis[code]) return 0;
    return vis[code]=1;
}

const int dx[] = {0,0,1,-1};
const int dy[] = {1,-1,0,0};
int bfs(){
    init_lookup_table();
    int front = 1, rear = 2;
    while(front!=rear){
        State& s = que[front];
        if(memcmp(s,goal,sizeof(goal))==0) return front;
        int z;
        for(z=0;z<9;z++) if(!s[z]) break;
        int x = z%3, y = z/3;
        for(int i=0;i<4;i++){
            int newx = x+dx[i];
            int newy = y+dy[i];
            int newz = newy*3+newx;
            if(newx>=0 && newx<3 && newy>=0 && newy<3){
                State& t = que[rear];
                memcpy(&t, &s, sizeof(s));
                t[newz] = s[z];
                t[z] = s[newz];
                dist[rear] = dist[front]+1;
                if(try_to_insert(rear)) rear++;
            }
        }
        front++;
    }
    return 0;
}
int main(){
    for(int i=0;i<9;i++)  scanf("%d", &que[1][i]);
    for(int i=0;i<9;i++)  scanf("%d", &goal[i]);
    int ans = bfs();
    if(ans>0) printf("%d\n",dist[ans]);
    else printf("-1\n");
    return 0;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 八数码问题也称为九宫问题。在3×3的棋盘,摆有八个棋子,每个棋子上标有1至8的某一数字,不同棋子上标的数字不相同。...
    听城阅读 13,303评论 0 1
  • 欢迎关注我的公众号:读书主义 更多精彩等着你! 这个读书方法,可能会颠覆你对读书以往的认知|开卷 或许读书已经成为...
    米米粒粒阅读 35,011评论 9 209
  • 看一看
    小朋友喜欢堆雪人阅读 663评论 0 0
  • 我是个崇尚自由的人,因而我的人生信条是,追求自由,坚持本心。 从高中时候就特别喜欢庄子,被那种以自由为情怀的...
    敏敏妮阅读 1,696评论 0 0
  • 耳边已经听不见喧嚣的都市声音,心跟着手中的键盘滴答跳动,一下两下.... 以前借阅朋友的那本大冰作品《阿弥陀福,么...
    肉都给我吃阅读 1,800评论 15 0