C语言解决六数码问题,求解最少变换次数

本文介绍了如何使用C语言解决六数码问题,并着重讲解了通过广度优先遍历算法来寻找最少变换次数的方法。在程序中,每当数码状态变化时,变换次数加1,从而得到最优解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述:
关于六数码问题在上一篇文章中已经介绍过,可参考C语言解决六数码问题
改进:
本次代码的功能是求解最少的变换次数。因为本程序的核心是基于数码状态所构成的图的广度优先遍历算法设计的,且每次变换的权值都为1,所以首次找到的变换策略即为拥有最少变换次数的方案。故只需在每次状态发生变化时累加1即可记录变换次数信息。

/*-------------------------------------------------
功能:解决六数码问题
描述:可实现对多组初始输入序列的判定,第一行为组数,
若变换成功,则输出最少变换次数,若失败,则输出-1。
输入示例:
3
6 5 4 3 2 1
2 5 3 1 4 6
2 3 6 1 5 4
输出示例:
5
1
2
---------------------------------------------------
Author: Zhang Kaizhou
Date: 2019-3-9 22:00:22
--------------------------------------------------*/
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define MAXSIZE 1000

int visited[700000] = { 0 }; // 定义一个全局访问数组,用于记录每个状态的访问情况

typedef struct node{ // 定义一个结点数据类型
    int data[6];
    int state_flag;
    int time; // 变换次数
    struct node * pnext;
} Node;

typedef struct{ // 定义一个队列数据类型
    Node * state[MAXSIZE]; // 指针数组用于存放各结点指针
    int head;
  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值