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

迭代启发搜索。

#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. 如何使用Python生成200个优惠券(激活码)

    解析: 常见的优惠券(激活码)是由数字.字母(大小写)组成: string.ascii_letters   26个大小写字母: string.digits 0-9数字: 随机组合 使用random.s ...

  2. 百度site网址显示完整站点信息的分析

    去年赛花红就发现百度site本博客网址,仅出现找到相关结果数约多少个,数字为估算值,网站管理员如需了解更准确的索引量,请使用百度站长平台等字样.但赛花红又发现有的网站却显示着完整的站点信息,当时以为是 ...

  3. 通过存储过程批量生成spool语句

    过存储过程批量生成spool语句 CREATE OR REPLACE PROCEDURE pro_yx_full_txt IS export_handle UTL_FILE.file_type; v_ ...

  4. C++ Stack 与String

    // ConsoleApplication1.cpp : 此文件包含 "main" 函数.程序执行将在此处开始并结束. // #include "pch.h" ...

  5. IDEA 官方背景与修改jsp模板以及字体大小

    一.官方背景切换 方法一:先打开file找到Settings  如图: 也可以用快捷方式打开:Ctrl+alt+s  打开 找到Editor点击进入 ,再然后找Color Scheme 可以看到如下图 ...

  6. javascript设计模式(张容铭)学习笔记 - 外观模式绑定事件

    有一个需求要为document对象绑定click事件来是想隐藏提示框的交互功能,于是小白写了如下代码: document.onclick = function(e) { e.preventDefaul ...

  7. 20181111 计时器影响DOM点击事件的逻辑

    今天在群里看见一个人在问"点击按钮使图片产生旋转为什么要使用计时器来实现",我自己操作了一遍她的代码才发现里面的逻辑实现很有意思,所以写出来分享一下. 她的代码是这样写的: < ...

  8. NOIP复习之1 数学数论

    noip一轮复习真的要开始啦!!! 大概顺序是这样的 1.数学 2.搜索贪心 3.数据结构 4.图论 5.dp 6.其他 数学 1.数论 数论被称为数学皇冠上的明珠,他的重要性主要在于它是其他学习的祖 ...

  9. [BZOJ] 1520: [POI2006]Szk-Schools

    费用流解决. abs内传不了int..CE一次 #include<iostream> #include<cstring> #include<cstdio> #inc ...

  10. matlplotlib绘图(二)

    matplotlib基础知识 matpltlib中的基本图表包括的元素 1.x轴和y轴:水平和垂直的轴线 2.x轴和y轴的刻度:刻度标识坐标值的分隔,包括最小刻度和最大刻度 3.x轴和y轴刻度:表示特 ...