实验要求:八数码难题也称九宫问题,它是在3×3的方格棋盘上,分别放置了表有数字1、2、3、4、5、6、7、8的八张牌,初始状态S0,目标状态Sg,要求程序能输入任意的初始状态和目标状态,要求通过空格来移动八张牌使得棋盘由初始状态到达目标状态。
**移动规则为:**每次只能将与空格(上下左右)相邻的一个数字平移到空格中。实验要求应用广度优先搜索策略寻找从初始状态到目标状态的解路径,编程语言为C系列语言。

完整代码如下:

#include<stdio.h>
struct node
{int a[3][3];int u;int d;int l;int r;int p;
};
int judge();
void search();
void up();
void down();
void left();
void right();
void output();
//typedef
node np[400000];
int target[3][3];
int f,r,zero_i,zero_j;
int x[100],y[100];
int main()
{f=0;r=0;int i,j,n;printf("请输入初始状态:\n");n=0;for(i=0;i<3;i++){for(j=0;j<3;j++){scanf("%d",&np[0].a[i][j]);if(np[0].a[i][j]!=0) x[n++]=np[0].a[i][j];}}np[0].p=-1;printf("请输入目标状态:\n");n=0;for(i=0;i<3;i++){for(j=0;j<3;j++){scanf("%d",&target[i][j]);if(target[i][j]!=0) y[n++]=target[i][j];}}if(judge()==1){search();}else printf("无法从该初始状态移动到目标状态\n");return 0;
}
int judge()
{int sum1=0,sum2=0,i,j;for(i=1;i<8;i++){for(j=0;j<i;j++){if(x[i]>x[j]) sum1++;if(y[i]>y[j]) sum2++;}}if((sum1%2)==(sum2%2)) return 1;else return 0;
}
void search()
{int i,j,temp;for(i=0;i<3;i++){for(j=0;j<3;j++){if(np[f].a[i][j]!=target[i][j]) break;}if(j<3) break;}if(i>=3&&j>=3) output(); else{// printf("111\n");for(zero_i=0;zero_i<3;zero_i++){for(zero_j=0;zero_j<3;zero_j++){if(np[f].a[zero_i][zero_j]==0)  break;}if(zero_j<3) break;}if(zero_i!=0) up();if(zero_i!=2) down();if(zero_j!=0) left();if(zero_j!=2) right();f++;search();}
}
void up()
{int i,j; r++;for(i=0;i<3;i++){for(j=0;j<3;j++){if((i==zero_i&&j==zero_j)) np[r].a[i][j]=np[f].a[zero_i-1][j];else if((i==zero_i-1&&j==zero_j)) np[r].a[i][j]=np[f].a[zero_i][j];else np[r].a[i][j]=np[f].a[i][j];}}np[r].p=f;np[f].u=r;
}
void down()
{int i,j; r++;for(i=0;i<3;i++){for(j=0;j<3;j++){if((i==zero_i&&j==zero_j)) np[r].a[i][j]=np[f].a[zero_i+1][j];else if((i==zero_i+1&&j==zero_j)) np[r].a[i][j]=np[f].a[zero_i][j];else np[r].a[i][j]=np[f].a[i][j];}}np[r].p=f;np[f].d=r;
}
void left()
{int i,j; r++;for(i=0;i<3;i++){for(j=0;j<3;j++){if((i==zero_i&&j==zero_j)) np[r].a[i][j]=np[f].a[zero_i][zero_j-1];else if((i==zero_i&&j==zero_j-1)) np[r].a[i][j]=np[f].a[zero_i][zero_j];else np[r].a[i][j]=np[f].a[i][j];}}np[r].p=f;np[f].l=r;
}
void right()
{int i,j; r++;for(i=0;i<3;i++){for(j=0;j<3;j++){if((i==zero_i&&j==zero_j)) np[r].a[i][j]=np[f].a[zero_i][zero_j+1];else if((i==zero_i&&j==zero_j+1)) np[r].a[i][j]=np[f].a[zero_i][zero_j];else np[r].a[i][j]=np[f].a[i][j];}}np[r].p=f;np[f].r=r;
}
void output()
{int i,j,n,m,temp,b[1000];char ch[1000];n=f;m=0;b[m]=f;while(np[n].p!=-1){//b[m+1]=np[n].p;temp=n;n=np[n].p;if(np[n].u==temp) ch[m]='U';if(np[n].d==temp) ch[m]='D';if(np[n].l==temp) ch[m]='L';if(np[n].r==temp) ch[m]='R';m++;b[m]=np[temp].p;}m--;for(i=0;i<3;i++){printf("      ");for(j=0;j<3;j++) printf("%d ",np[0].a[i][j]);printf("\n");}printf("\n");while(m>=0){printf("%c     ",ch[m]);for(i=0;i<3;i++){for(j=0;j<3;j++) printf("%d ",np[b[m]].a[i][j]);printf("\n");printf("      ");}printf("\n");m--;}
}

人工智能:(C语言)采用状态空间法求解八数码问题相关推荐

  1. 【人工智能实验】A*算法求解8数码问题

    目录 实验一 A*算法求解8数码问题 一.实验目的 二.实验原理 三.实验结果 四.实验总结 附录代码 推荐文章 实验一 A*算法求解8数码问题 一.实验目的 熟悉和掌握启发式搜索的定义.估价函数和算 ...

  2. 利用Python求解八数码难题

    实验目的 实验内容 八数码问题也称为九宫问题.在3×3的棋盘,摆有八个棋子,每个棋子上标有1至8的某一数字,不同棋子上标的数字不相同.棋盘上还有一个空格,与空格相邻的棋子可以移到空格中.要求解决的问题 ...

  3. 基于Python实现的AStar求解八数码问题

    资源下载地址:https://download.csdn.net/download/sheziqiong/86776612 资源下载地址:https://download.csdn.net/downl ...

  4. 人工智能作业 - A*算法程序求解八数码

    文章目录 A*算法 简介 思路 A*伪代码 八数码问题 题目描述 注意事项 实验过程 解决思路 伪代码 二维压缩为一维 检查是否有解 其他 代码实现 h1和h2的对比 关于曼哈顿距离 参考链接 A*算 ...

  5. 7种方法求解八数码问题

    [八数码问题]//https://vijos.org/p/1360 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要 ...

  6. 【人工智能导论】A*算法求解15数码问题 Java

    完整源码 - Eclipse项目文件 - GitHub地址 题目描述 关于本算法 两个晚上写完的,不足之处多多指教- 启发函数的选择: 一开始选用不在位数码个数+节点深度作为启发函数,效果不是很好. ...

  7. 多种方法求解八数码问题

    AI的实验报告,改了改发上来.希望路过的大牛不吝赐教.非常是纳闷我的ida*怎么还没有双搜快.还有发现基于不在位启示的A*和Ida*都挺慢.尤其是ida* 搜索31步的竟然要十几秒.是我写的代码有问题 ...

  8. C语言局部搜索算法(爬山法,模拟退火法,遗传算法)求解八皇后问题

    C语言局部算法求解八皇后问题 写在前面 八皇后问题及局部搜索算法 爬山法(hill-climbing searching) 算法介绍 代码实现 退火法(simulated annealing) 算法介 ...

  9. 【人工智能】八数码问题:广度搜索、深度搜索

    应用广度搜索BFS和深度搜索DFS解决八数码问题,广度搜索和深度搜索都是盲目搜索,相关理论知识,算法过程:问题求解:状态空间图和盲目搜索. 参考:7种方法求解八数码问题 Python实现A*算法解决N ...

最新文章

  1. 14 款免费漂亮的 BuddyPress 主题
  2. 【Python】Python语言学习:面向对象编程,类和对象,封装、继承和多态
  3. liunx mysql端口没开_linuxmysql可以terminal登录,3306端口未打开原因记录(转)
  4. bigdecimal判断等于0_shell 脚本中if判断的条件总结
  5. “弱肉强食,月半者为王” | OpenDILab推出多智能体博弈环境Go-Bigger
  6. vue的双向数据绑定的原理
  7. 运营九年,这款音乐手游宣布停服!将从应用商店下架...
  8. 飘了!英特尔 2 年内要发布高效芯片超过苹果 M1
  9. 微信支付phpv3给我们留下的坑
  10. 程序猿代码面试指南 PDF
  11. OSChina 周二乱弹 —— 仙女抚我顶,脱发不长生
  12. mysql bi 报表_BI报表是什么,BI报表的好处,BI和报表的区别
  13. 百度离线地图金字塔瓦片发布
  14. 怎么画图自动生成HTML,用canvas写一个简易画图工具
  15. [poj1797] Heavy Transportation
  16. Java-MQTT客户端监控连接状态事件
  17. linux下write()和read()函数详解
  18. C++-Cmake指令:link_directories【指定第三方库所在路径】【官方不建议使用该命令,取而代之的为find_package()、find_library()】
  19. 【财富空间】格局大不大,看这一点就知道了
  20. excel VBA chr(63)无法替换问题

热门文章

  1. html图片自动适应窗口大小,使用CSS自动调整浏览器大小的图片大小
  2. 无人驾驶不听指挥,交警该怎么办?
  3. 举个栗子!Tableau 技巧(107):如何自定义 Server 登录页背景
  4. 显示mac上隐藏的资源库文件方法
  5. 微博情感分析的表情符号平滑语言模型(A11, AAAI2012)
  6. AFNetworking 使用说明
  7. ceph rgw:bucket policy实现
  8. net has only one pin的解决方法
  9. 内网地址映射成外网可访问地址
  10. 用计算机升级ipad系统软件,iPad怎么设置软件程序自动更新?