估价函数其实就是与目标状态有几个不同。。。

迭代启发搜索。

#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <fstream>
#include <iostream>
#include <queue> #define rep(i, l, r) for(int i = l; i <= r; i++)
#define down(i, l, r) for(int i = l; i >= r; i--)
#define maxn 123
#define MAX 1<<30; using namespace std; int n[6][6], k, x, y;
char s[9]; int F()
{
int c = 0;
rep(i, 1, 5) if (n[1][i] == 0) c++;
rep(i, 2, 5) if (n[2][i] == 0) c++;
rep(i, 4, 5) if (n[3][i] == 0) c++;
if (n[4][5] == 0) c++;
rep(i, 1, 5) if (n[5][i] == 1) c++;
rep(i, 1, 4) if (n[4][i] == 1) c++;
rep(i, 1, 3) if (n[3][i] == 1) c++;
if (n[2][1] == 1) c++;
return c;
} bool Search(int x, int y, int c)
{
if (!c && x == 3 && y == 3 && !F()) return true;
if (c < F()-1) return false;
//int now = F(), a;
int a;
if (x > 2 && y > 1)
{
a = n[x-2][y-1]; n[x-2][y-1] = n[x][y]; n[x][y] = a;
if (Search(x-2, y-1, c-1)) return true;
a = n[x-2][y-1]; n[x-2][y-1] = n[x][y]; n[x][y] = a;
}
if (x > 1 && y > 2)
{
a = n[x-1][y-2]; n[x-1][y-2] = n[x][y]; n[x][y] = a;
if (Search(x-1, y-2, c-1)) return true;
a = n[x-1][y-2]; n[x-1][y-2] = n[x][y]; n[x][y] = a;
}
if (x < 5 && y > 2)
{
a = n[x+1][y-2]; n[x+1][y-2] = n[x][y]; n[x][y] = a;
if (Search(x+1, y-2, c-1)) return true;
a = n[x+1][y-2]; n[x+1][y-2] = n[x][y]; n[x][y] = a;
}
if (x < 4 && y > 1)
{
a = n[x+2][y-1]; n[x+2][y-1] = n[x][y]; n[x][y] = a;
if (Search(x+2, y-1, c-1)) return true;
a = n[x+2][y-1]; n[x+2][y-1] = n[x][y]; n[x][y] = a;
}
if (x < 4 && y < 5)
{
a = n[x+2][y+1]; n[x+2][y+1] = n[x][y]; n[x][y] = a;
if (Search(x+2, y+1, c-1)) return true;
a = n[x+2][y+1]; n[x+2][y+1] = n[x][y]; n[x][y] = a;
}
if (x < 5 && y < 4)
{
a = n[x+1][y+2]; n[x+1][y+2] = n[x][y]; n[x][y] = a;
if (Search(x+1, y+2, c-1)) return true;
a = n[x+1][y+2]; n[x+1][y+2] = n[x][y]; n[x][y] = a;
}
if (x > 2 && y < 5)
{
a = n[x-2][y+1]; n[x-2][y+1] = n[x][y]; n[x][y] = a;
if (Search(x-2, y+1, c-1)) return true;
a = n[x-2][y+1]; n[x-2][y+1] = n[x][y]; n[x][y] = a;
}
if (x > 1 && y < 4)
{
a = n[x-1][y+2]; n[x-1][y+2] = n[x][y]; n[x][y] = a;
if (Search(x-1, y+2, c-1)) return true;
a = n[x-1][y+2]; n[x-1][y+2] = n[x][y]; n[x][y] = a;
}
return false;
} int main()
{
int t; scanf("%d", &t);
while (t--)
{
rep(i, 1, 5)
{
scanf("%s", s);
rep(j, 1, 5)
if (s[j-1] == '*') x = i, y = j, n[i][j] = 0;
else if (s[j-1] == '0') n[i][j] = 0;
else n[i][j] = 1;
}
k = 0;
while (k <= 15) if (Search(x, y, k)) break; else k++;
if (k == 16) k = -1; printf("%d\n", k);
}
}

  

BZOJ-1085 骑士精神的更多相关文章

  1. bzoj 1085骑士精神

    bzoj 1085骑士精神 在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士,且有一个空位.在任何时候一个骑士都能按照骑士的走法(它可以走到和它横坐标相差为1,纵坐标相差为2或者横坐标相差为2 ...

  2. A*算法详解 BZOJ 1085骑士精神

    转载1:A*算法入门 http://www.cppblog.com/mythit/archive/2009/04/19/80492.aspx 在看下面这篇文章之前,先介绍几个理论知识,有助于理解A*算 ...

  3. BZOJ 1085 骑士精神 迭代加深搜索+A*

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1085 题目大意: 在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且有一个 ...

  4. bzoj 1085骑士精神 迭代深搜

    题目传送门 题目大意:给出一幅棋盘,问能否复原,中文题面,不做解释. 思路:第一次写迭代深搜的题目,这道题还是挺经典的.这道题的状态很明显的每多搜一层就是多八倍,非常的多,而且又是t组输入,所以必定有 ...

  5. [BZOJ]1085 骑士精神(SCOI2005)

    这种鲜明的玄学风格很明显就是十几年前的题目. Description 在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且有一个空位.在任何时候一个骑士都能按照骑士的走法(它可以走到和它横坐 ...

  6. [bzoj] 1085 骑士精神 || ID-DFS

    原题 找到最少的步数成为目标状态. IDDFS(限制层数的dfs)即可 #include<cstdio> #include<algorithm> using namespace ...

  7. BZOJ SCOI2005骑士精神

    裸IDA*,ans从1到15循环来限制搜索深度. #include<cstdio> #include<cstring> #include<algorithm> us ...

  8. Bzoj 1085: [SCOI2005]骑士精神 (dfs)

    Bzoj 1085: [SCOI2005]骑士精神 题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1085 dfs + 剪枝. 剪枝方法: ...

  9. 【BZOJ】1085: [SCOI2005]骑士精神(A*启发式搜索)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1085 囧啊囧,看了题解后写了个程序,但是样例总过不了T+T,调试了不下于1个小时,肉眼对拍看了根本看 ...

  10. [BZOJ 1085] [SCOI2005] 骑士精神 [ IDA* 搜索 ]

    题目链接 : BZOJ 1085 题目分析 : 本题中可能的状态会有 (2^24) * 25 种状态,需要使用优秀的搜索方式和一些优化技巧. 我使用的是 IDA* 搜索,从小到大枚举步数,每次 DFS ...

随机推荐

  1. CORS的原理及应用

    CORS的原理及应用 CORS是跨站资源共享,同样是解决浏览器的同源策略 其本质是设置响应头,使得浏览器允许跨域请求. 第三方网站返回数据的时候在浏览器的响应头中添加允许的域名,允许所有的用* 1 简 ...

  2. 用简单的语言描述C++ 是什么?

    用简单的语言描述C++ 是什么? 答:C++是在C语言的基础上开发的一种面向对象编程语言,应用广泛.C++支持多种编程范式 --面向对象编程.泛型编程和过程化编程. 其编程领域众广,常用于系统开发,引 ...

  3. javaweb基础(24)_jsp一般的标签开发

    一.标签技术的API 1.1.标签技术的API类继承关系 二.标签API简单介绍 2.1.JspTag接口 JspTag接口是所有自定义标签的父接口,它是JSP2.0中新定义的一个标记接口,没有任何属 ...

  4. 微信iOS多设备多字体适配方案总结

    一.背景 2014下半年,微信iOS版先后适配iPad, iPhone6/6plus.随着这些大屏设备的登场,部分用户觉得微信的字体太小,但也有很多用户不喜欢太大的字体.为了满足不同用户的需求,我们做 ...

  5. stringByAppendingString和stringByAppendingPathComponent

    NSString提供了两个拼串的方法: /** * @brief 简单的字符串拼接,头文件 NSString (NSStringExtensionMethods) * * @param aString ...

  6. 【Python学习之五】高级特性2(切片、迭代、列表生成器、生成器、迭代器)

    2.迭代 如果给定一个list或tuple,我们可以通过for循环来遍历这个list或tuple,这种遍历我们称为迭代(Iteration).在Python中,迭代是通过for ... in来完成的. ...

  7. python 项目中包中__init__.py文件的作用

    开发python项目时,我遇到了一个这样的现象,当我新建一个pythonpackage时,总会自动地生成一个空的__init__.py文件,因为是python新手,所以很不了解这个空文件的作用是什么, ...

  8. LeetCode(172)Factorial Trailing Zeroes

    题目 Given an integer n, return the number of trailing zeroes in n!. Note: Your solution should be in ...

  9. Selenium2启动浏览器且加载插件

    一.SELENIUM2启动浏览器 注意: SELENIUM2在启动浏览器时,都是启动一个干净的没有任务 插件及cookies信息的浏览器,即使是你之前的浏览器有设置过代理,到自动化启动时,也是没有代理 ...

  10. JAVA、JDK等入门概念,下载安装JAVA并配置环境变量

    一.概念 Java是一种可以撰写跨平台应用程序的面向对象的程序设计语言,具体介绍可查阅百度JAVA百科,这里不再赘述. Java分为三个体系,分别为: Java SE(J2SE,Java2 Platf ...