八数码c语言编程深度搜索,广度优先搜索解 八数码, 求意见, 求bug/

已结贴√

问题点数:100 回复次数:31

ca56232b3bbedf9a539d07f37fffb99a.gif

3144d8b7615c79d9f638db40d5689d26.gif

a218af6549b45ee526caf607ebff1358.gif

0f8df0e29816ae721419de940fb833d1.gif

广度优先搜索解 , 求意见, 求bug/

我得去买票了,....

#include

#include

#include

#define NUM 5

typedef struct bgMatrix

{

int v, w;

char matrix[NUM][NUM];

int pre;

}Matrix;

typedef struct bgQueue

{

Matrix* data;

int maxLength;

int head;

int tail;

}BGQueue;

typedef BGQueue* Queue;

char srcMatrix[NUM][NUM] =

{

{'*', '*', '*', '*', '*'},

{'*', '1', '2', '3', '*'},

{'*', '4', '5', '6', '*'},

{'*', '7', '8', '0', '*'},

{'*', '*', '*', '*', '*'}

};

char dstMatrix[NUM][NUM] =

{

{'*', '*', '*', '*', '*'},

{'*', '1', '2', '0', '*'},

{'*', '4', '5', '3', '*'},

{'*', '7', '8', '6', '*'},

{'*', '*', '*', '*', '*'}

};

int dx[4] = {0, 0, -1, 1};

int dy[4] = {-1, 1, 0, 0};

int cnt = -1;

Queue queue;

FILE* log;

void bfs(Matrix matrix);

void initQueue(int length);

void putQueue(Matrix matrix);

Matrix getQueue(void);

int isQueueEmpty(void);

int isQueueFull(void);

int matrixCmp(char src[][NUM], char dst[][NUM]);

void matrixCpy(char dst[][NUM], char src[][NUM]);

void matrixPrint(char matrix[][NUM]);

void bgOpenLog(void);

void bgWriteLog(const char* s);

void bgCloseLog(void);

int main(void)

{

Matrix src;

bgOpenLog();

initQueue(5200);

src.v = 3;

src.w = 3;

matrixCpy(src.matrix, srcMatrix);

src.pre = cnt;

bfs(src);

bgCloseLog();

getchar();

return 0;

}

void bfs(Matrix matrix)

{

Matrix t;

int v, w;

int direction, tmp;

putQueue(matrix);

while (!isQueueEmpty())

{

t = getQueue();

if (!matrixCmp(t.matrix, dstMatrix))

{

cnt++;

for (direction = 0; direction < 4; direction++)

{

v = t.v + dx[direction]; w = t.w + dy[direction];

if (srcMatrix[v][w] != '*')

{

tmp = t.matrix[t.v][t.w];

t.matrix[t.v][t.w] = t.matrix[v][w];

t.matrix[v][w] = tmp;

t.v = v;

t.w = w;

t.pre = cnt;

putQueue(t);

}

}

}

else

{

matrixPrint(t.matrix);

for (tmp = t.pre; !matrixCmp(queue->data[tmp].matrix, srcMatrix); tmp = queue->data[tmp].pre)

{

matrixPrint(queue->data[tmp].matrix);

}

matrixPrint(srcMatrix);

return;

}

}

}

void initQueue(int length)

{

queue = malloc(sizeof(BGQueue));

queue->data = malloc(sizeof(Matrix) * length);

queue->maxLength = length;

queue->head = 0;

queue->tail = 0;

}

void putQueue(Matrix matrix)

{

queue->data[queue->tail++] = matrix;

queue->tail = queue->tail % queue->maxLength;

}

Matrix getQueue(void)

{

Matrix ret;

ret = queue->data[queue->head++];

queue->head = queue->head % queue->maxLength;

return ret;

}

int isQueueEmpty(void)

{

return queue->head == queue->tail;

}

int isQueueFull(void)

{

return ((queue->tail+1) % queue->maxLength) == queue->head;

}

int matrixCmp(char src[][NUM], char dst[][NUM])

{

int i, j, s, t, ret;

char srcString[30] = {0};

char dstString[30] = {0};

s = 0;

t = 0;

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

{

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

{

srcString[s++] = src[i][j];

dstString[t++] = dst[i][j];

}

}

ret = !strcmp(srcString, dstString);

return ret;

}

void matrixCpy(char dst[][NUM], char src[][NUM])

{

int i, j;

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

{

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

{

dst[i][j] = src[i][j];

}

}

}

void matrixPrint(char matrix[][NUM])

{

char logTxt[60] = {0};

int i, j, k;

k = 0;

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

{

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

{

logTxt[k++] = matrix[i][j];

}

logTxt[k++] = '\r';

logTxt[k++] = '\n';

}

logTxt[k++] = '\r';

logTxt[k++] = '\n';

bgWriteLog(logTxt);

}

void bgOpenLog(void)

{

if(log == NULL)

{

log = fopen("log.txt", "wb");

}

}

void bgWriteLog(const char* s)

{

fwrite(s, sizeof(char), strlen(s), log);

}

void bgCloseLog(void)

{

fclose(log);

log = NULL;

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/528346.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux定时任务每两天执行,Linux定时任务 crontab每秒执行 实现2种方法

linux crontab 命令&#xff0c;最小的执行时间是一分钟&#xff0c; 如果要在小于一分钟执行。就要换个方法来实现&#xff0c;下面分别以两种方法来实现&#xff1a;tolog.phpfile_put_contents(/home/fujieace/php/crontab/run.log, date(Y-m-d H:i:s)."\r\n", FI…

C语言中的标识符以字母或下划线开头,牛逼大神整理的C语言基础知识,你确定你不码下来?...

【【怪兽爱C语言】牛逼大神整理的C语言基础知识&#xff0c;你确定你不码下来&#xff1f;】https://toutiao.com/group/6577344220355363341/?iid15906422033&appexplore_article&timestamp1531501720&tt_fromcopy_link&utm_sourcecopy_link&utm_mediumt…

c语言switch同时比较多个变量,C语言学习if和switch分支选择结构

如何判断一个整数是否为正数计算机同我们一样&#xff0c;也是可以判断大小。在此之前&#xff0c;我们需要先说明在计算机中用来判断两个数关系的符号&#xff0c;即关系运算符。关系运算符号c语言中的关系运算符与数学上学习的有什么不同&#xff1f;image.png关系表达式的值…

c语言字符串升序输出,编写程序将已按升序排好的两个字符串a和b中的字符按升序归并到字符串c中,最后输出”abcdefghijklmnpq”。...

满意答案sjoest2014.08.18采纳率&#xff1a;59% 等级&#xff1a;8已帮助&#xff1a;663人(1)char a[]"acegikm"; a数组没有赋予数组大小&#xff0c;所以它的大小&#xff0c;默认等于赋予的字符串长度等于7&#xff0c;所以当strcat(a,b)时&#xff0c;…

c语言指针化简带分数,c语言带分数四则运算问题!!!要求被调函数,化简.

满意答案Lie囡2013.02.03采纳率&#xff1a;58% 等级&#xff1a;12已帮助&#xff1a;8948人#include long int a,b,c,d,x,y,z;char op;int f1();int f2();main(){printf("shu ru di yi ge shu de fen zi:");scanf("%ld",&a);printf("shu ru …

keil C对lib封装库反汇编成C语言,Keil软件“C语言”及“汇编”混编 —— 相关知识整理.doc...

Keil软件“C语言”与“汇编”混编相关知识整理用Keil在C中嵌入汇编1在Keil中嵌入汇编2介绍直接嵌入汇编代码的方法4采用汇编可能会有的好处5Keil C语言与汇编语言混合编程7深入剖析Keil C51 —— 从汇编到C519C语言和汇编语言的变量以及函数的接口问题14汇编与C语言混合编程的关…

c语言smile定义函数,【C初始之习题五】

1.实现一个函数&#xff0c;打印乘法口诀表&#xff0c;口诀表的行数和列数自己指定&#xff0c;输入9&#xff0c;输出99口诀表&#xff0c;输入12&#xff0c;输出1212的乘法口诀表。#define _CRT_SECURE_NO_WARNINGS#include#includevoid Sum(int x){int num 0;for (int i …

2017年9月计算机二级c语言,2017年9月计算机二级C语言程序设计练习题

2017年9月计算机二级C语言程序设计练习题2017年计算机二级考试即将在九月份进行&#xff0c;你准备好了吗?下面是小编为大家带来的计算机二级C语言程序设计练习题&#xff0c;欢迎阅读。练习题一&#xff1a;阅读程序题1、int x6, y7;printf(“%d,”,x); printf(“%d”,y);程序…

c语言中for优化,c – 在For循环中发生了什么GCC优化?

使用gcc 4.6和-O3,我使用简单的时间命令计时以下四个代码#include int main(int argc, char* argv[]){double val 1.0;unsigned int numIterations 1e7;for(unsigned int ii 0;ii < numIterations;ii) {val * 0.999;}std::cout<}案例1在0.09秒内运行#include int main…

android string数字字符串如何使用科学计数法,JSONObject 偶遇 数字字符串变为科学计数法 如何变为普通数字字符串...

和 XML 一样&#xff0c;JSON 也是基于纯文本的数据格式。由于 JSON 天生是为 JavaScript 准备的&#xff0c;因此&#xff0c;JSON的数据格式非常简单&#xff0c;您可以用 JSON 传输一个简单的 String&#xff0c;Number&#xff0c;Boolean&#xff0c;也可以传输一个数组&a…

android getter不起作用,java - 如何在Android Studio中自动生成getter和setter

java - 如何在Android Studio中自动生成getter和setterAndroid Studio中是否有一个快捷方式可以自动生成给定类中的getter和setter&#xff1f;14个解决方案454 votes在编辑器中使用Alt Insert for Windows或Command N for Mac&#xff0c;您可以轻松地为类的任何字段生成get…

android中activity布局,Activity布局初步(一)

LinearLayout和TableLayout一、LinearLayout&#xff1a;线性布局(就是把控件一个挨着一件排下来)[代码]xml代码&#xff1a;android:id —— 为控件指定相应的IDandroid:text —— 指定控件当中显示的文字&#xff0c;需要注意的是&#xff0c;这里尽量使用strings.xml文件当…

离散中多重组合是指_PLC编程中如何使用开关、模拟、脉冲量

在工业自动化控制中&#xff0c;经常会遇到开关量&#xff0c;数字量&#xff0c;模拟量&#xff0c;离散量&#xff0c;脉冲量等各种概念&#xff0c;而人们在实际应用中&#xff0c;对于这些概念又很容易混淆。作为电气工程及其自动化设计人员来说&#xff0c;弄清楚这些变量…

Android连接相机WiFi,安卓手机使用佳能相机机身wifi传输拍摄的操作

第一步 相机基础设置首先请确保相机具有WIFI功能&#xff1b;设置相机图像包含JPG格式&#xff1b;3. 相机电源设置&#xff0c;请关闭相机的自动关闭电源功能以保证传输&#xff1a;MENU→“自动关闭电源”→选择“关闭”或“最长时间”&#xff1b;4. ftp设置&#xff0c;…

word论文排版插件_教你如何用word快速搞定论文排版

在疫情影响下&#xff0c;各大高校纷纷开启了远程指导论文/答辩&#xff0c;尽量不影响毕业时间。这不&#xff0c;前段时间湖北武汉科技大学的同学&#xff0c;利用视频在家顺利通过博士学位论文答辩。emmm&#xff0c;人家都答辩完半个月了&#xff0c;回头瞧瞧我们&#xff…

kodi android 键盘,KODI按键映射,看IPTV按键设置

KODI按键映射&#xff0c;看IPTV按键设置2020-04-09 18:10:1016点赞76收藏7评论KODI播放器功能丰富&#xff0c;其中自定义按键功能也是强大&#xff0c;可以让用户修改各个场景下各个按键的功能&#xff0c;网上好多文章没把事情说明白或太复杂&#xff0c;本教程教大家以简单…

不采取任何措施 盒盖_得了癌症如果不化疗能活多久?医生的答案很实在

癌症有不同的治疗手段&#xff0c;有手术&#xff0c;有放疗&#xff0c;有化疗……说到化疗&#xff0c;有人就说千万不要化疗&#xff0c;千万不要化疗&#xff0c;于是很多人拒绝化疗。有人就问&#xff1a;癌症如果不化疗能活多久&#xff1f;癌症如果不化疗能活多久&#…

android iOS 都精通,Android IOS开发要理解何为面向对象的思维

何为面向对象的思维&#xff1f;面向对象 VS面向过程OOP 》面向对象&#xff0c;全称Object Oriented ProgrammingPOP 》面向过程&#xff0c;全称Process-oriented programming1、通俗的理解&#xff1a;有一天你想吃鱼香肉丝了&#xff0c;怎么办呢&#xff1f;你有两个选择&…

单片机全局有必要封装_C语言开发单片机为什么大多数都采用全局变量的形式?...

全局变量简直就是嵌入式系统的戈兰高地。冲突最激烈的双方是1. 做控制的工程师 2. 做非嵌入式的软件工程师。第一派做控制的工程师。他们普遍的理解就是“变量都写成全局该有多方便”。我之前面试过一个非常有名的做控制实验室里出来的PhD/Master&#xff0c;前前后后陆续有快十…

html 最小边框宽度,css如何让div边框不占宽度?

HTML中&#xff0c;给一个DIV添加一个边框&#xff0c;那么这个DIV的宽度和高度就增加成为这个DIV的宽度加上这个边框的宽度&#xff0c;那么我们如何让边框不占宽度呢&#xff1f;我们做网站时可以添加边框box-sizing属性&#xff1a;让边框不占宽度&#xff0c;在DIV宽度内画…