题目链接:

https://www.lydsy.com/JudgeOnline/problem.php?id=1085

题目大意:

在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且有一个空位。在任何时候一个骑士都能按照骑士的走法(它可以走到和它横坐标相差为1,纵坐标相差为2或者横坐标相差为2,纵坐标相差为1的格子)移动到空位上。 给定一个初始的棋盘,怎样才能经过移动变成如下目标棋盘: 为了体现出骑士精神,他们必须以最少的步数完成任务。

思路:

迭代加深搜索+A*剪枝即可。

每次枚举上限搜索,可以防止dfs每次都要搜到15的深度。

 #include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(false);//不可再使用scanf printf
#define Max(a, b) ((a) > (b) ? (a) : (b))//禁用于函数,会超时
#define Min(a, b) ((a) < (b) ? (a) : (b))
#define Mem(a) memset(a, 0, sizeof(a))
#define Dis(x, y, x1, y1) ((x - x1) * (x - x1) + (y - y1) * (y - y1))
#define MID(l, r) ((l) + ((r) - (l)) / 2)
#define lson ((o)<<1)
#define rson ((o)<<1|1)
#define Accepted 0
#pragma comment(linker, "/STACK:102400000,102400000")//栈外挂
using namespace std;
inline int read()
{
int x=,f=;char ch=getchar();
while (ch<''||ch>''){if (ch=='-') f=-;ch=getchar();}
while (ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
typedef long long ll;
const int maxn = + ;
const int MOD = ;//const引用更快,宏定义也更快
const int INF = 1e9 + ;
const double eps = 1e-; int ans[][] =
{
,,,,,
,,,,,
,,,,,
,,,,,
,,,,
};
int dir[][] = {,,,-,-,,-,-,,,,-,-,,-,-};
int flag, k;
bool judge(int a[][])
{
for(int i = ; i < ; i++)for(int j = ; j < ; j++)
if(a[i][j] != ans[i][j])return false;
return true;
}
int eva(int a[][])//至少还需要走的步数
{
int tmp = ;
for(int i = ; i < ; i++)for(int j = ; j < ; j++)
if(a[i][j] != ans[i][j])tmp++;
return tmp;
}
void Search(int d, int a[][], int x, int y)
{
if(d == k){flag = judge(a); return;}
if(flag)return;
for(int i = ; i < ; i++)
{
int xx = x + dir[i][];
int yy = y + dir[i][];
if(xx < || xx > || yy < || yy > )continue;
swap(a[x][y], a[xx][yy]);
if(eva(a) + d <= k)Search(d + , a, xx, yy);
swap(a[x][y], a[xx][yy]);
}
}
int main()
{
int T;
scanf("%d", &T);
while(T--)
{
char Map[];
int a[][];
int x, y;
flag = ;
for(int i = ; i < ; i++)
{
scanf("%s", Map);
for(int j = ; j < ; j++)
if(Map[j] == '*')a[i][j] = , x = i, y = j;
else a[i][j] = Map[j] - '';
}
for(k = ; k <= ; k++)
{
Search(, a, x, y);
if(flag){printf("%d\n", k);break;}
}
if(!flag)printf("-1\n"); }
return Accepted;
}

BZOJ 1085 骑士精神 迭代加深搜索+A*的更多相关文章

  1. BZOJ.1085.[SCOI2005]骑士精神(迭代加深搜索)

    题目链接 最小步数这类,适合用迭代加深搜索. 用空格走代替骑士. 搜索时记录上一步防止来回走. 不需要每次判断是否都在位置,可以计算出不在对应位置的骑士有多少个.而且每次复原一个骑士至少需要一步. 空 ...

  2. BZOJ1085: [SCOI2005]骑士精神 [迭代加深搜索 IDA*]

    1085: [SCOI2005]骑士精神 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1800  Solved: 984[Submit][Statu ...

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

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

  4. bzoj 1085骑士精神

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

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

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

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

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

  7. BZOJ-1085:骑士精神 (迭代加深 + A*搜索)

    题意:给定一个5*5的棋盘,上面有白马给妈给12匹,以及一个空格.问是否能在15步内有给定棋盘转移到目标棋盘. 如果可以,输出最小步数. 否则输出-1: 思路:由于步数比较小,我们就直接不记录状态vi ...

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

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

  9. 【bzoj1085】【 [SCOI2005]骑士精神】启发式剪枝+迭代加深搜索

    (上不了p站我要死了,侵权度娘背锅) 如果这就是启发式搜索的话,那启发式搜索也不是什么高级玩意嘛..(啪啪打脸) Description 在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且 ...

随机推荐

  1. ASP.NET开发,且编且改,分清职责

    本篇Insus.NET使用一个实例,分享在ASP.NET开发时,一个功能一个方法(函数),且编且改,一步一个脚印把实例完成.在方法多变多形式的情况之下,怎样把写出来程序简单明了. 下面是一个Excel ...

  2. php json_encode在CI框架中的使用细节

    这个错误的造成原因是加载类类库,转换成json格式的时候不熟悉CI框架的规定导致的,CI框架中规定在将数据转换成json格式的时候需要将类库小写,当然了,调用的时候必须保证有这个类库,且可以在对应的文 ...

  3. 多线程系列(3)任务Task

    虽然使用线程池ThreadPool让我们使用多线程变得容易,但是因为是由系统来分配的,如果想对线程做精细的控制就不太容易了,比如某个线程结束后执行一个回调方法.恰好Task可以实现这样的需求.这篇文章 ...

  4. 设计模式之建造者模式(Buider)(5)

    简介 在软件开发中,也会存在一些构造非常复杂的对象,这些对象拥有一系列的成员属性,这些成员属性有些是基本数据类型,有些是引用类型,总之就是一句话,这个对象的构建比较复杂.在这里我们就将复杂对象当做汽车 ...

  5. JavaScript--表单处理(27)

    一 表单介绍 // 在HTML中,表单是由<form>元素来表示的,而在JavaScript中,表单对应的则是HTMLFormElement类型; // HTMLFormElement继承 ...

  6. JavaScript弹出窗口方法

    本文实例汇总了常用的JavaScript弹出窗口方法,供大家对比参考,希望能对大家有所帮助.详细方法如下: 1.无提示刷新网页: 大家有没有发现,有些网页,刷新的时候,会弹出一个提示窗口,点“确定”才 ...

  7. 5月8日——iOS中的3D Touch效果

    需要在manifest.json文件中进行配置 需要执行的js代码为: 最终操作效果为 本篇文章主要采用了HTML5+  中的 launcher属性 具体可参照 http://www.html5plu ...

  8. redis下载地址

    redisgithub下载地址:https://github.com/MicrosoftArchive/redis进入之后,如下所示进行下载. 进入页面进行选择版本下载. ,下载好之后,在本地解压如下 ...

  9. es6 类 和构造函数

  10. 3.1 - Apps or metadata that mentions the name of any other mobile platform will be rejected

    3.1 - Apps or metadata that mentions the name of any other mobile platform will be rejected3.1 Detai ...