搜索算法
前言:
我重新理了以下思路,并用代码实现了一下八数码问题的解决.
主要用的算法为2个: [深度优先搜索] (c语言描述)和 [广度优先搜索](java语言描述) 。
其他的搜索算法暂时没搞。。 先挖个坑有空再来填。
文章目录
OPEN表和CLOSED表
搜索算法中设置两个表:OPEN和CLOSED.
OPEN中记录所有已经生成的未考察的结点,CLOSED表中记录已访问过的结点.
在搜索算法中根据估价函数重排OPEN表,每次只考察OPEN表中最优的结点.
八数码问题`
从初始状态到目标状态,对于人来说还是很容易实现的.但是要交给计算机来执行,就要选择合适的算法.我们可以把每一次移动都当做是空格的移动.
以下就用几个算法来解决这个问题.
一、深度优先搜索 (c语言描述)
所谓深度优先搜索,就是在每次扩展一个结点时,选择到目前为止深度最深的结点优先扩展.(盲目搜索,不撞南墙不回头)
如图:
搜索结束,其他结点不再扩展.
#include<stdio.h>
int x = 2, y = 1; //x,y为空格坐标
int bx=2,by=1;
int min = 999; //最小步数
int book[3][3]={
0};//记录是否走过
int curr[3][3] = {
{
2,8,3} ,
{
1,6,4} ,
{
7,0,5} }; //初始状态
int main(){
void dfs(int x, int y, int step);
book[x][y]=1;
dfs(x,y,0);
printf("最小步数=%d\n",min);
return 0;
}
void dfs(int x, int y, int step){
int next[4][2] = {
{
-1,0},//up
{
1,0},//down
{
0,-1},//left
{
0,1} //right
};
int tx,ty,k,temp;
//判断是否达到目标状态
if(curr[0][0]==1 && curr[0][1]==2 && curr[0][2]==3 && curr[1][0]==8 && curr[1][1