问题描述:
关于六数码问题在上一篇文章中已经介绍过,可参考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;