用a*演算法來解決八數碼問題。
#include
#include
#include
using
namespace
std;
int open_cnt=0;
int open_node_cnt;//open表節點個數
int close_cnt=0;
int noresoult=0;
struct nodestart,end;
struct open_closeopen[10000],close[10000];
bool isable()
}for(int i=0;i<9;i++)
}if((tf%2==1&&ef%2==1)||(tf%2==0&&ef%2==0)) return
true;
else
return
false;
}int a_start_h(node *node)
if(end.a[i][j]==k)}}
h+=abs(old_x-end_x)+abs(old_y-end_y);
}
return h;
}void input()}}
for(int i=0;i<3;i++)}}
start.g=0;
start.h=a_start_h(&start);
start.f=start.g+start.h;
}int show(node *node)
printf("\n");
}cout
<<"**********====\n\n";
}bool isend(node *node)
}return
true;
} void sort(open_close *open)
}temp=open[min_flag];
open[min_flag]=open[0];
open[0]=temp;
}void move(int flag,node *node)
}n->a[node->x][node->y]=node->a[node->x-1][node->y];
n->a[node->x-1][node->y]=0;
n->x=node->x-1;
n->y=node->y;
n->flag=3;
n->father=node;
n->g=node->g+1; // 求 g()
n->h=a_start_h(n);
n->f=n->g+n->h;
open_cnt++;
open_node_cnt++;
open[open_cnt].np=n; //新增到open表
open[open_cnt].f=n->f; // 求 f()
}else
if(flag==2&&node->y<2)
}n->a[node->x][node->y]=node->a[node->x][node->y+1];
n->a[node->x][node->y+1]=0;
n->x=node->x;
n->y=node->y+1;
n->flag=4;
n->father=node;
n->g=node->g+1; // 求 g()
n->h=a_start_h(n);
n->f=n->g+n->h;
open_cnt++;
open_node_cnt++;
open[open_cnt].np=n; //新增到open表
open[open_cnt].f=n->f; // 求 f()
}else
if(flag==3&&node->x<2)
}n->a[node->x][node->y]=node->a[node->x+1][node->y];
n->a[node->x+1][node->y]=0;
n->x=node->x+1;
n->y=node->y;
n->flag=1;
n->father=node;
n->g=node->g+1; // 求 g()
n->h=a_start_h(n);
n->f=n->g+n->h;
open_cnt++;
open_node_cnt++;
open[open_cnt].np=n; //新增到open表
open[open_cnt].f=n->f; // 求 f()
}else
if(flag==4&&node->y>0)
}n->a[node->x][node->y]=node->a[node->x][node->y-1];
n->a[node->x][node->y-1]=0;
n->x=node->x;
n->y=node->y-1;
n->flag=2;
n->father=node;
n->g=node->g+1; // 求 g()
n->h=a_start_h(n);
n->f=n->g+n->h;
open_cnt++;
open_node_cnt++;
open[open_cnt].np=n; //新增到open表
open[open_cnt].f=n->f; // 求 f()
}
} void expand(node *node)
}int main()
expand(open[0].np);//擴充套件最優節點的子節點
open[0].np=null;
open[0].f=-1;
open_node_cnt--;
sort(open); //open表排序}}
else
cout
<<"無解";
} /*
有解1 0 3
7 2 4
6 8 5
1 2 3
8 0 4
7 6 5
無解1 2 3
4 0 7
6 5 8
3 2 1
6 5 0
4 7 8
*/
人工智慧 搜尋 啟發式搜尋
搜尋演算法的形式化描述 狀態state 動作motion 狀態轉移state transition 路徑path 測試目標test target 一 啟發式搜尋 有資訊搜尋 heuristic search 代表演算法 貪婪最佳優先搜尋 greedy best first search a 搜尋 啟...
人工智慧 有資訊搜尋 (啟發式)
一 最佳優先搜尋 根據評價函式選擇表現的最佳的節點進行擴充套件 最佳優先搜尋 best first search 演算法 不同的方法有不同的評價函式 啟發函式,標記h x h n 從節點n到目標的最低耗散估計值 啟發函式是額外資訊的一種最普通的形式 二 貪婪最佳優先搜尋 最先擴充套件離目標節點最近的...
八數碼問題 啟發式搜尋
一 問題描述 在乙個3 3 的方棋盤上放置著 1,2,3,4,5,6,7,8 八個數碼 每個數碼佔一格 且有乙個空格。這些數碼可以在棋盤上移動,其移動規則是 與空格相鄰的數碼方格可以移入空格。現在的問題是 對於指定的初始棋局和目標棋局,給出數碼的移動序列。該問題稱八數碼難題或者重排九宮問題。原始碼 ...