[题解] 八数码问题的多种解法

传送门

1. 朴素 bfs ,map 判重,实现最简单

#include <iostream>
#include <cstdio>
#include <unordered_map>
#include <algorithm>
#include <queue>
#define int long long
using namespace std;
queue<int> q;
unordered_map<int,int> mp;
const int goal=123804765;
const int dx[]={-1,0,0,1};
const int dy[]={0,-1,1,0};
int n;
void bfs(){
	q.push(n);mp[n]=0;
	while(!q.empty()){
		int u=q.front();q.pop();
		int c[3][3],f=0,g=0,n=u;
		if(u==goal)break;
		for(int i=2;i>=0;i--)
			for(int j=2;j>=0;j--){
				c[i][j]=n%10;
				n/=10;
				if(!c[i][j])f=i,g=j;//空白结点 
			}
		for(int i=0;i<4;i++){
			int xx=f+dx[i],yy=g+dy[i],ss=0;
			if(xx<0||yy<0||xx>2||yy>2)continue;
			swap(c[xx][yy],c[f][g]);
			for(int i=0;i<3;i++)
				for(int j=0;j<3;j++){
					ss=ss*10+c[i][j];
				}
			if(!mp.count(ss)){
				q.push(ss);
				mp[ss]=mp[u]+1;
			}
			swap(c[xx][yy],c[f][g]);
		}	
	}
	cout<<mp[goal]<<endl;
	exit(0);
}
signed main(){
	scanf("%d",&n);
	bfs();
	return 0;
}

2. IDA*

#include <iostream>
#include <cstdio>
#include <unordered_map>
#include <algorithm>
#include <queue>
#include <cmath>
using namespace std;
int deep;
string st,ed;
const int dx[]={1,-1,0,0},dy[]={0,0,1,-1}; 
int h(string st){//评估函数 
	int ans=0;
	for(int i=0;i<st.size();i++){
		if(st[i]=='0')continue;
		int j=ed.find(st[i]),r=i/3,c=i%3;
		int x=j/3,y=j%3;
		ans+=abs(r-x)+(c-y); 
	}
}
bool dfs(int now,int pre){
	int H=h(st);
	if(!H)return true;
	if(now+cnt>deep)return false;
	......
}
posted @ 2021-08-12 16:30  ¶凉笙  阅读(43)  评论(0编辑  收藏  举报