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

迭代启发搜索。

#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. HDU 5097 Page Rank (模拟)

    题目背景是以前用来对网页进行排名的Page Rank算法,是早期Google的革命性发明. 背后的原理是矩阵和图论.这个数学模型是由Google的创始人拉里·佩奇和谢尔盖·布林发现的. 如果一个网页被 ...

  2. UVA 12901 Refraction 折射 (物理)

    一道物理题,解个2次方程就行了... 求h最小的情况对应如下图所示 做法不唯一,我想避免精度损失所以在化简的时候尽可能地去避免sqrt和浮点数乘除. 似乎精度要求很低,直接用角度算也可以 #inclu ...

  3. python_98_面向对象_学校

    class School(object):#以后都加object(基类) def __init__(self, name, addr): self.name = name self.addr = ad ...

  4. sqlite 新建实体时出错

    解决方式 手动下载 问题原因

  5. ovx openVirtex安装

    搞了好久的pox实验,中途一个星期没更新了吧, 今天继续... 新手第一次搞还是在虚拟机上最安全~ ovx参照上面的做吧,注意必须在联网的情况下,否则很多控件都连不上(第一次做的时候虚拟机没配ip 坑 ...

  6. MySQL使用INSERT插入多条记录

    MySQL使用INSERT插入多条记录,应该如何操作呢?下面就为您详细介绍MySQL使用INSERT插入多条记录的实现方法,供您参考. 看到这个标题也许大家会问,这有什么好说的,调用多次INSERT语 ...

  7. iOS深拷贝与浅拷贝

    概念 对象拷贝有两种方式:浅复制和深复制.顾名思义,浅复制,并不拷贝对象本身,仅仅是拷贝指向对象的指针:深复制是直接拷贝整个对象内存到另一块内存中. 如图详解:

  8. Java-JFrame-swing嵌套浏览器步骤

    Java-JFrame-swing嵌套浏览器步骤 一.使用swing嵌套浏览器要实现的功能: 通过java的swing实现在一个窗体中嵌套一个浏览器,可以在这个浏览器中将另一个项目的内容显示出来,只需 ...

  9. Persona5

    65536K   Persona5 is a famous video game. In the game, you are going to build relationship with your ...

  10. PAT Basic 1074

    1074 宇宙无敌加法器 地球人习惯使用十进制数,并且默认一个数字的每一位都是十进制的.而在 PAT 星人开挂的世界里,每个数字的每一位都是不同进制的,这种神奇的数字称为“PAT数”.每个 PAT 星 ...