ida.cpp

来自「滑块问题求解系统:利用深度优先搜索和广度优先搜索解决有趣的滑块问题求解系统。」· C++ 代码 · 共 85 行

CPP
85
字号
#include "stdafx.h"
#include "ida.h"


extern HASH tree;

CString IDA::getResult(){
	CString str = searcher::getResult();
	if(result == SUCCESS){
		char ss[50];
		sprintf(ss, "\r\n迭代时最多扩展出%d个结点", top + 1);
		str += ss;
	}
	return str;
}

CString IDA::getIntroduction(){
	CString intro = "IDA*搜索算法\r\n\r\n"
					"是基于重复式深度优先的A*算法,忽略所有f值大于深度限制的结点。"
					"由于逐步加大限制,能保证找到最优解。启发函数采"
					"用所有图片到达目的地的曼哈顿距离之和";
	return intro;
}


int IDA::search(int begin, int end, int &stop, int val){
	if((getreverse(begin) & 1) != (getreverse(end) & 1) ){  //逆序数不一样,无解
		result = NOANSWER;
		return -1;
	}
	std::queue<int> Q;
	result = SUCCESS;
	open[0].father = -1;
	open[0].step = 0;
	open[0].status = begin;
	int index, tmp, limit;
	for(index = 0, tmp = begin; tmp % 10; ++index, tmp /= 10);
	open[0].zero = index;		
	open[0].val = reset(begin, end); //初始转换信息	
	limit = open[0].val - 1;
	totalnode = 0;
	while(!stop){
		Q.push(top = 0);
		limit ++;
		tree.reset();
		tree.add(begin);
		do{
			index = Q.front();
			Q.pop();
			if(open[index].status == end){
				last_index = index;
				totalnode += top;
				expanded = totalnode + 1 - Q.size();
				inopen = Q.size();
				return 1;
			}
			if(limit < open[index].val)
				continue;
			int zero = open[index].zero;
			for(int i = 0; i < dir_count[zero]; i++){				
				int tmp = getnextstatus(open[index].status, zero, dir[zero][i]);
				if(tree.add(tmp) ){
					open[++top].father = index;
					open[top].status = tmp;
					open[top].step = open[index].step + 1;
					open[top].zero = dir[zero][i];
					open[top].val = getval(tmp, (open[index].val - open[index].step), zero, dir[zero][i]) 
								+ open[top].step;
					Q.push(top);
				}
			}
		}while(!stop && !Q.empty() );
		totalnode += top + 1;
	}

	expanded = top + 1 - Q.size();
	inopen = Q.size();
	if(stop){
		result = STOP;
		return -2;
	}
	result = CANTFIND;
	return 0;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?