九宫重排深度优先搜索、广度优先搜索、A*算法实现c++

首先感谢大神!没用大神的讲解不知道实验要怎么交代,大神代码讲解在此

  1. 深度优先:
#include<iostream>
#include<vector>
#include<algorithm>
#include<ctime>
using namespace std;
const int GRID = 3;
int rightPos[9] = {
    0,0,0,0,0,0,0,0,0 };
int depth=10;
int sum=0;
class state{
   
public:
	int panel [GRID][GRID];
	int level;
	state* parent;
	state(int level) : level(level){
   };
	bool operator ==(state& q){
   
		for(int i=0;i<GRID;i++){
   
			for(int j=0;j<GRID;j++){
   
				if(this->panel[i][j]!=q.panel[i][j])
					return false;				
			}
		}
	return true;
	}
	state& operator =(state& p){
   
		for(int i=0;i<GRID;i++){
   
			for(int j=0;j<GRID;j++){
   
				this->panel[i][j]=p.panel[i][j];
			}
		}
		return *this;
	}
};

int findZero(state st){
   
	for(int i=0;i<GRID;i++){
   
		for(int j=0;j<GRID;j++){
   
			if(st.panel[i][j]==0)
				return i*GRID+j;
		}
	}
}
int countH(state& st){
   
	int k=0;
	int h=0;
	for(int i=0;i<GRID;i++){
   
		for(int j=0;j<GRID;j++){
   
			if(st.panel[i][j]!=rightPos[k++])
				h++;
		}
	}
	return h;
}
vector<state*>::iterator look_up_dup(vector<state*>& vec,state* p){
   
	vector<state*>::iterator it_r=vec.begin();
	for(;it_r!=vec.end();it_r++){
   
		if((*(*it_r))==*p)
			break;
	}
	return it_r;
}

vector<state*> open_table;
vector<state*> close_table;
void dump_panel(state* p){
   
	for(int i=0;i<GRID;i++){
   
		for(int j=0;j<GRID;j++){
   
			cout<<p->panel[i][j]<<" ";
			
		}
		cout<<endl;
	}
}

state* search(state& start){
   
	int level=0;
	open_table.push_back(&start);
	int count=0;
	while(!open_table.empty()){
   
		state* p=open_table.back();
		close_table.push_back(p);
		open_table.pop_back();
		if(countH(*p)==0)
			return p;
		if(p->level>=depth)
			continue;
		level=p->level+1;
		int zeroPos=findZero(*p);
		int x=zeroPos/3;
		int y=zeroPos%3;
		for(int i=0;i<4;i++){
   
			int x_offset=0,y_offset=0;
			switch(i){
   
				case 0:x_offset=1,y_offset=0;break;
				case 1:x_offset=0,y_offse
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值