启发式搜索c语言实现,启发式搜索算法解决八数码问题(C语言).pdf

1、程序源代码

#include

#include

struct node{

int a[3][3];// 用二维数组存放 8 数码

int hx;// 函数 h (x )的值,表示与目标状态的差距

struct node *parent;// 指向父结点的指针

struct node *next;// 指向链表中下一个结点的指针

};

//hx 函数 //

int hx(int s[3][3])

{// 函数说明:计算 s 与目标状态的差距值

int i,j;

int hx=0;

int sg[3][3]={1,2,3,8,0,4,7,6,5};

for(i=0;i<3;i++)

for(j=0;j<3;j++)

if(s[i][j]!=sg[i][j])

hx++;

return hx;

}

//hx 函数 end//

//extend 扩展函数 //

struct node *extend(node *ex)

{ // 函数说明:扩展 ex 指向的结点,并将扩展所得结点组成一条

//单链表, head 指向该链表首结点,并且作为返回值

int i,j,m,n; // 循环变量

int t; //临时替换变量

int flag=0;

int x[3][3];// 临时存放二维数组

struct node *p,*q,*head;

head&

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
启发式搜索是一种常用于解决八数码问题算法八数码问题是指在一个3x3的棋盘上,摆放了1-8的数字和一个空格,要求通过交换数字和空格的位置,最终将棋盘恢复为如下状态: 1 2 3 4 5 6 7 8 以下是使用C语言实现八数码问题启发式搜索的基本步骤: 1. 定义状态结构体,包含当前状态的数组、空格位置、当前状态的代价和深度等信息。 2. 定义启发式函数,用于评估当前状态的优劣程度。启发式函数可以使用曼哈顿距离或者不在位数等方式进行计算。 3. 定义状态扩展函数,用于生成当前状态的所有可能的下一步状态。 4. 定义搜索函数,使用优先队列来存储待扩展的状态,每次取出代价最小的状态进行扩展,直到找到目标状态。 5. 在搜索过程中,需要记录每个状态的深度和父状态,以便在找到目标状态后回溯路径。 下面是一个简单的C语言实现八数码问题启发式搜索的代码示例: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #define N 3 typedef struct { int board[N][N]; // 当前状态的数组 int x, y; // 空格位置 int cost; // 当前状态的代价 int depth; // 当前状态的深度 int parent; // 父状态的下标 } State; int goal[N][N] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 0}}; // 目标状态 int dx[4] = {0, 1, 0, -1}; // 上下左右四个方向 int dy[4] = {-1, 0, 1, 0}; int manhattan(State s) { // 曼哈顿距离启发式函数 int sum = 0; for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { if (s.board[i][j] != 0) { int x = (s.board[i][j] - 1) / N; int y = (s.board[i][j] - 1) % N; sum += abs(x - i) + abs(y - j); } } } return sum; } int misplaced(State s) { // 不在位数启发式函数 int sum = 0; for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { if (s.board[i][j] != goal[i][j]) { sum++; } } } return sum; } int is_goal(State s) { // 判断是否为目标状态 return memcmp(s.board, goal, sizeof(goal)) == 0; } void print_board(State s) { // 打印当前状态的数组 for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { printf("%d ", s.board[i][j]); } printf("\n"); } } void print_path(State *states, int n) { // 打印路径 if (n == -1) { return; } print_path(states, states[n].parent); printf("Step %d:\n", states[n].depth); print_board(states[n]); printf("\n"); } void search(State initial_state, int (*heuristic)(State)) { // 启发式搜索函数 State states[362880]; // 最多有9!个状态 int visited[362880] = {0}; // 标记是否访问过 int front = 0, rear = 0; // 队列的头和尾 initial_state.cost = heuristic(initial_state); initial_state.depth = 0; initial_state.parent = -1; states[rear++] = initial_state; visited[initial_state.cost] = 1; while (front < rear) { State s = states[front++]; if (is_goal(s)) { // 找到目标状态 printf("Found goal state!\n"); print_path(states, front - 1); return; } for (int i = 0; i < 4; i++) { // 扩展当前状态 int nx = s.x + dx[i]; int ny = s.y + dy[i]; if (nx < 0 || nx >= N || ny < 0 || ny >= N) { continue; } State t = s; t.board[s.x][s.y] = t.board[nx][ny]; t.board[nx][ny] = 0; t.x = nx; t.y = ny; t.cost = heuristic(t); t.depth = s.depth + 1; t.parent = front - 1; if (!visited[t.cost]) { // 新状态 states[rear++] = t; visited[t.cost] = 1; } } } printf("Failed to find goal state!\n"); } int main() { State initial_state = { {{2, 8, 3}, {1, 6, 4}, {7, 0, 5}}, // 初始状态 1, 2, 0, 0, -1 // 空格位置为(1, 2),代价为0,深度为0,父状态为-1 }; search(initial_state, manhattan); // 使用曼哈顿距离启发式函数进行搜索 return 0; } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值