8数码,8PUZZLE 问题 C++ 代码

用到A* 算法。还有h方程。定义如代码里面。

我的代码如下:


8puzzle.h:

#include<iostream>
#include<fstream>
#include<list>
#include<list>
#include<map>
#include<string>
#include<sstream>
#include<math.h>
#include<algorithm>
using namespace std;
void begin();
int** input();
int** goal();
class state
{
public:
	state(int bd[3][3],state *prnt=NULL);
	state& operator=(const state& other);
	~state();
	void print();
	state* getparent();
	void setparent(state* prnt);
	void setg(int a);
	int getg();
	int board[3][3];
	void seth(int a);
	int geth();
	void setf();
	int getf();
	state& operator=(state& other);
	state *parent;
private:
	int g,h,f;
	
};
int h1function (state &s, state &s1);
int h2function (state &s, state &s2);
bool lesssecond (state *s1, state *s2);
string transform (state* s);
state* up(state* s,int row, int column);
state* down(state* s,int row, int column);
state* right(state* s,int row, int column);
state* left(state* s,int row, int column);


8puzzle.cpp


#include<iostream>
#include<fstream>
#include<list>
#include<algorithm>
#include<list>
#include<map>
#include<sstream>
#include<string>
#include<math.h>
#include <stdlib.h>   
#include"8puzzle.h"
using namespace std;
void begin()
{
	cout<<"Goal State:"<<endl;
	cout<<"1"<<"\t"<<"2"<<"\t"<<"3"<<"\t"<<endl;
	cout<<"8"<<"\t"<<" "<<"\t"<<"4"<<"\t"<<endl;
	cout<<"7"<<"\t"<<"6"<<"\t"<<"5"<<"\t"<<endl;
	cout<<"Initial State (Input):"<<endl;
}
int** input()
{
	int a[9];
	for(int j=0;j<9;j++)
	{
		cin>>a[j];
	}
	for(int k=0;k<9;k++)
	{
		
		if(k%3==0)
		{
			if(a[k]==0) { cout<<endl<<" "<<"\t"; continue;}
			else { cout<<endl<<a[k]<<"\t"; continue;}
		}
		if(a[k]==0) { cout<<" "<<"\t"; continue;}
		else { cout<<a[k]<<"\t"; continue;}
	}
	cout<<endl;
	int **bd;
	bd=new int*[3];
	for(int i=0;i<3;i++)
		bd[i]=new int[3];
	bd[0][0]=a[0];
	bd[0][1]=a[1];
	bd[0][2]=a[2];
	bd[1][0]=a[3];
    bd[1][1]=a[4];
    bd[1][2]=a[5];
    bd[2][0]=a[6];
	bd[2][1]=a[7];
	bd[2][2]=a[8];
	return bd;
}
int** goal()
{
	int **bd;
	bd=new int*[3];
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是8 puzzle问题BFS解法的C代码,可以输出最少移动次数和路径: ```c #include<stdio.h> #include<stdlib.h> #include<string.h> #include<queue> using namespace std; const int MAXN=3; const int MAXS=1000000; int dis[MAXS],fa[MAXS],vis[MAXS],ope[MAXN][MAXN]; int dx[]={0,0,1,-1},dy[]={1,-1,0,0}; char dir[]="RLDU"; struct node { int s[MAXN][MAXN]; int x,y; }; int cantor(int s[][MAXN]) { int a[MAXN*MAXN],cnt=0; for(int i=0;i<MAXN;i++) for(int j=0;j<MAXN;j++) a[cnt++]=s[i][j]; int res=0; for(int i=0;i<MAXN*MAXN;i++) { int num=0; for(int j=i+1;j<MAXN*MAXN;j++) if(a[i]>a[j]) num++; res+=num*dis[MAXN*MAXN-i-1]; } return res; } void decantor(int x) { int a[MAXN*MAXN],cnt=0; for(int i=0;i<MAXN*MAXN;i++) a[i]=i; for(int i=MAXN*MAXN-1;i>=0;i--) { int t=x/dis[i]; x%=dis[i]; ope[cnt/MAXN][cnt%MAXN]=a[t]; cnt++; for(int j=t;j<MAXN*MAXN-1;j++) a[j]=a[j+1]; } } void bfs() { queue<node> q; node tmp; memset(vis,0,sizeof(vis)); memset(dis,-1,sizeof(dis)); tmp.x=tmp.y=0; memcpy(tmp.s,ope,sizeof(ope)); int s=cantor(tmp.s); dis[s]=0; vis[s]=1; q.push(tmp); while(!q.empty()) { node u=q.front(); q.pop(); for(int i=0;i<4;i++) { int nx=u.x+dx[i],ny=u.y+dy[i]; if(nx<0||nx>=MAXN||ny<0||ny>=MAXN) continue; node v=u; swap(v.s[u.x][u.y],v.s[nx][ny]); v.x=nx,v.y=ny; int t=cantor(v.s); if(!vis[t]) { dis[t]=dis[cantor(u.s)]+1; fa[t]=cantor(u.s); vis[t]=1; q.push(v); } } } } int main() { dis[0]=1; for(int i=1;i<=MAXN*MAXN;i++) dis[i]=dis[i-1]*i; for(int i=0;i<MAXN;i++) for(int j=0;j<MAXN;j++) scanf("%d",&ope[i][j]); bfs(); int ans=dis[MAXN*MAXN-1]; for(int i=0;i<MAXN;i++) for(int j=0;j<MAXN;j++) if(ope[i][j]) ans/=ope[i][j]; if(dis[cantor(ope)]==-1) printf("unsolvable\n"); else { printf("%d\n",dis[cantor(ope)]); int p=cantor(ope); while(p) { decantor(p); for(int i=0;i<MAXN;i++) { for(int j=0;j<MAXN;j++) { printf("%d ",ope[i][j]); } printf("\n"); } printf("\n"); p=fa[p]; } } return 0; } ``` 需要注意的是,输入的初始状态需要保证是可解的,如果不可解则输出"unsolvable"。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值