热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

搜索:启发式搜索

启发式搜索只能深搜一般也是用来解决最优解问题的在一个55的棋盘上有12个白色的骑士和12个黑色的骑士,且有一个空位。在任何时候一个骑士都能按照骑士的走法(

启发式搜索只能深搜

一般也是用来解决最优解问题的

在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且有一个空位。

在任何时候一个骑士都能按照骑士的走法(它可以走到和它横坐标相差为1,纵坐标相差为2或者横坐标相差为2,纵坐标相差为1的格子)移动到空位上。

给定一个初始的棋盘,怎样才能经过移动变成如下目标棋盘: 为了体现出骑士精神,他们必须以最少的步数完成任务。

引入了启发函数之后,可以很好地改善效率,但是只能深搜

1 #include
2 #include
3 #include
4 using namespace std;
5 int T,k;
6 int ans[5][5]={{1,1,1,1,1},
7 {0,1,1,1,1},
8 {0,0,2,1,1},
9 {0,0,0,0,1},
10 {0,0,0,0,0}};
11 int xx[8]={1,1,-1,-1,2,2,-2,-2};
12 int yy[8]={2,-2,2,-2,1,-1,1,-1};
13 int flag=0;
14 int judge(int a[5][5])
15 {
16 for(int i&#61;0;i<5;i&#43;&#43;)
17 for(int j&#61;0;j<5;j&#43;&#43;)
18 if(ans[i][j]!&#61;a[i][j])return 0;
19 return 1;
20 }
21 int eva(int a[5][5],int s)
22 {
23 int v&#61;0;
24 for(int i&#61;0;i<5;i&#43;&#43;)
25 for(int j&#61;0;j<5;j&#43;&#43;)
26 if(a[i][j]!&#61;ans[i][j]){v&#43;&#43;;if(v&#43;s>k)return 0;}
27 return 1;
28 }
29 void search(int s,int a[5][5],int x,int y)
30 {
31 if(s&#61;&#61;k){if(judge(a))flag&#61;1;return;}
32 if(flag&#61;&#61;1)return;
33 for(int i&#61;0;i<8;i&#43;&#43;)
34 {
35 int nowx&#61;x&#43;xx[i],nowy&#61;y&#43;yy[i];
36 if(nowx<0||nowx>4||nowy<0||nowy>4)continue;
37 swap(a[x][y],a[nowx][nowy]);
38 if(eva(a,s))search(s&#43;1,a,nowx,nowy);
39 swap(a[x][y],a[nowx][nowy]);
40 }
41 }
42 int main()
43 {
44 scanf("%d",&T);
45 while(T--)
46 {
47 int a[5][5];int x,y;
48 memset(a,0,sizeof(a));
49 for(int i&#61;0;i<5;i&#43;&#43;)
50 {
51 char ch[10];scanf("%s",ch);
52 for(int j&#61;0;j<5;j&#43;&#43;)
53 {
54 if(ch[j]&#61;&#61;&#39;*&#39;){a[i][j]&#61;2;x&#61;i;y&#61;j;}
55 else a[i][j]&#61;ch[j]-&#39;0&#39;;
56 }
57 }
58 for(k&#61;1;k<&#61;15;k&#43;&#43;)
59 {search(0,a,x,y);if(flag){printf("%d\n",k);break;}}
60 if(!flag)printf("-1\n");
61 else flag&#61;0;
62 }
63 return 0;
64 }

 

转:https://www.cnblogs.com/aininot260/p/9627460.html



推荐阅读
  • hlg_oj_1116_选美大赛这题是最长子序列,然后再求出路径就可以了。开始写的比较乱,用数组什么的,后来用了指针就好办了。现在把代码贴 ... [详细]
  • 本文详细介绍了Linux系统中信号量的相关函数,包括sem_init、sem_wait、sem_post和sem_destroy,解释了它们的功能和使用方法,并提供了示例代码。 ... [详细]
  • 在1995年,Simon Plouffe 发现了一种特殊的求和方法来表示某些常数。两年后,Bailey 和 Borwein 在他们的论文中发表了这一发现,这种方法被命名为 Bailey-Borwein-Plouffe (BBP) 公式。该问题要求计算圆周率 π 的第 n 个十六进制数字。 ... [详细]
  • 问题描述现在,不管开发一个多大的系统(至少我现在的部门是这样的),都会带一个日志功能;在实际开发过程中 ... [详细]
  • 本文介绍如何手动实现一个字符串连接函数,该函数不依赖于C语言的标准字符串处理函数,如strcpy或strcat。函数原型为void concatenate(char *dest, char *src),其主要作用是将源字符串src追加到目标字符串dest的末尾。 ... [详细]
  • 网络流24题——试题库问题
    题目描述:假设一个试题库中有n道试题。每道试题都标明了所属类别。同一道题可能有多个类别属性。现要从题库中抽取m道题组成试卷。并要求试卷包含指定类型的试题。试设计一个满足要求的组卷算 ... [详细]
  • 在尝试加载支持推送通知的iOS应用程序的Ad Hoc构建时,遇到了‘no valid aps-environment entitlement found for application’的错误提示。本文将探讨此错误的原因及多种可能的解决方案。 ... [详细]
  • 二维码的实现与应用
    本文介绍了二维码的基本概念、分类及其优缺点,并详细描述了如何使用Java编程语言结合第三方库(如ZXing和qrcode.jar)来实现二维码的生成与解析。 ... [详细]
  • Java 中的十进制样式 getZeroDigit()方法,示例 ... [详细]
  • 本文通过C++语言实现了一个递归算法,用于解析并计算数学表达式的值。该算法能够处理加法、减法、乘法和除法操作。 ... [详细]
  • 本文详细介绍了JQuery Mobile框架中特有的事件和方法,帮助开发者更好地理解和应用这些特性,提升移动Web开发的效率。 ... [详细]
  • 洛谷 P4009 汽车加油行驶问题 解析
    探讨了经典算法题目——汽车加油行驶问题,通过网络流和费用流的视角,深入解析了该问题的解决方案。本文将详细阐述如何利用最短路径算法解决这一问题,并提供详细的代码实现。 ... [详细]
  • importjava.io.*;importjava.util.*;publicclass五子棋游戏{staticintm1;staticintn1;staticfinalintS ... [详细]
  • 本文详细介绍了如何利用 Bootstrap Table 实现数据展示与操作,包括数据加载、表格配置及前后端交互等关键步骤。 ... [详细]
  • 数据类型--char一、char1.1char占用2个字节char取值范围:【0~65535】char采用unicode编码方式char类型的字面量用单引号括起来char可以存储一 ... [详细]
author-avatar
为你空手的执着
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有