zoukankan      html  css  js  c++  java
  • 【洛谷P1379】八数码难题 状压bfs

    对于这道题来说,每个时刻的状态是整个棋盘所有棋子的位置,即:任何一个棋子位置发生了移动,都会使得状态转移。
    因此,需要采取将整个状态作为广搜的搜索对象,进行状态压缩。采用哈希得到每个状态的对应的数值,同时维护一个 map 判重即可,顺便记录走到当前状态所需的最短步数。

    代码如下

    #include <bits/stdc++.h>
    using namespace std;
    const int dx[]={0,0,1,-1};
    const int dy[]={1,-1,0,0};
    const int ed=123804765;
    
    int st,a[4][4],nx,ny;
    map<int,int> mp;
    queue<int> q;
    
    void change(int x){
    	for(int i=3;i>=1;i--)
    		for(int j=3;j>=1;j--){
    			a[i][j]=x%10,x/=10;
    			if(!a[i][j])nx=i,ny=j;
    		}
    }
    
    int get_hash(){
    	int tot=0;
    	for(int i=1;i<=3;i++)
    		for(int j=1;j<=3;j++)
    			tot=tot*10+a[i][j];
    	return tot;
    }
    
    void bfs(){
    	scanf("%d",&st);
    	q.push(st);
    	mp[st]=0;
    	while(q.size()){
    		int u=q.front();q.pop();
    		if(u==ed)break;
    		change(u);
    		for(int i=0;i<4;i++){
    			int x=nx+dx[i],y=ny+dy[i];
    			if(x<1||y<1||x>3||y>3)continue;
    			swap(a[x][y],a[nx][ny]);//改变状态
    			int v=get_hash();//得到新的哈希值
    			if(!mp.count(v)){
    				mp[v]=mp[u]+1;
    				q.push(v);
    			}
    			swap(a[x][y],a[nx][ny]);//复原之前的状态
    		}
    	}
    	printf("%d
    ",mp[ed]);
    }
    
    int main(){
    	bfs();
    	return 0;
    }
    
  • 相关阅读:
    构建WebGL目标时的内存考量
    译作感想
    sign
    VS code搭建C环境
    003 总线
    计算机混淆概念(更新……)
    002计算机硬件性能指标
    001计算机基本组成与工作过程
    Linux虚拟机手动安装eclipse
    VMware安装vmtools实现宿主机和虚拟机共享粘贴板
  • 原文地址:https://www.cnblogs.com/wzj-xhjbk/p/9919104.html
Copyright © 2011-2022 走看看