八数码

作者: Amosasas | 来源:发表于2017-09-28 00:36 被阅读0次

八数码,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;
}

相关文章

  • 数字能量学之《八星数组作用规律》

    八星数码: 生气数码,延年数码, 天医数码,㐲位数码, 绝命数码,五鬼数码, 六煞数码,祸害数码, 一、能量大小的...

  • 八数码

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

  • 八数码

    这道题是Acwing上面845题. 八数码是一道bfs的扩展应用。这道题主要是你能够把整个二维数组抽象成一个str...

  • 八数码问题

    Note:实现代码之前可以先写出伪代码,可以节省很多时间。编程语言只是一种实现工具。

  • 八数码实现

    闲来无事,把八数码实现一下:BFS,DFS,A* 原理也没什么好说的,记录一下写代码遇到的问题。 状态的判重 我的...

  • Python 七段数码管绘制

    数码管是一种半导体发光器件,数码管可分为七段数码管和八段数码管,区别在于八段数码管比七段数码管多一个用于显示小数点...

  • 八数码(BFS解法)

    题目链接[https://www.luogu.com.cn/problem/P1379] 采用BFS思路解决八数码...

  • 51单片机之数码管静态显示,锁存器的使用

    八段数码管显示原理 八段数码管由8颗LED组成,根据LED的接法,数码管可分为共阴极和共阳极 共阴极是指每一颗LE...

  • A*算法求解八数码和十五数码(JDK 1.9)

    总体来说就是构造节点和非递归搜索...为了让代码有通用性,数码的大小可以用变量代替。 然后就是Astar算法了,相...

  • 八数码问题解析

    PPT展示

网友评论

      本文标题:八数码

      本文链接:https://www.haomeiwen.com/subject/uxopextx.html