Description

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

Input

  第一行有一个正整数T(T<=10),表示一共有N组数据。接下来有T个5×5的矩阵,0表示白色骑士,1表示黑色骑士,*表示空位。两组数据之间没有空行。

Output

  对于每组数据都输出一行。如果能在15步以内(包括15步)到达目标状态,则输出步数,否则输出-1。

Sample Input

2
10110
01*11
10111
01001
00000
01011
110*1
01110
01010
00100

Sample Output

7
-1

HINT

Source

Solution

  裸的搜索一定超时。我们用一下A*

  令估价函数$f(n) = g(n) + h(n)$,其中$g(n)$表示当前递归深度,$h(n)$表示目前的棋盘和目标棋盘有多少个格子是不一样的

  那么$f(n) > ans$时就不用在搜下去了。

 #include <bits/stdc++.h>
using namespace std;
const char s2[][] = {{""}, {""}, {"00*11"}, {""}, {""}};
char s1[][];
int dx[] = {, , , , -, -, -, -};
int dy[] = {, , -, -, -, -, , };
int ans; bool check_same()
{
for(int i = ; i < ; i++)
for(int j = ; j < ; j++)
if(s1[i][j] != s2[i][j]) return false;
return true;
} int astar(int dep)
{
for(int i = ; i < ; i++)
for(int j = ; j < ; j++)
if(s1[i][j] != s2[i][j]) dep++;
return dep;
} void DFS(int dep)
{
int x, y;
if(check_same()) ans = min(ans, dep - );
if(dep >= ans) return;
for(int i = ; i < ; i++)
for(int j = ; j < ; j++)
if(s1[i][j] == '*') x = i, y = j;
for(int i = ; i < ; i++)
{
x += dx[i], y += dy[i];
if(x > - && x < && y > - && y < )
{
swap(s1[x][y], s1[x - dx[i]][y - dy[i]]);
if(astar(dep) <= ans) DFS(dep + );
swap(s1[x][y], s1[x - dx[i]][y - dy[i]]);
}
x -= dx[i], y -= dy[i];
}
} int main()
{
int t;
cin >> t;
while(t--)
{
ans = ;
for(int i = ; i < ; i++)
for(int j = ; j < ; j++)
cin >> s1[i][j];
DFS();
cout << (ans == ? - : ans) << endl;
}
return ;
}

[BZOJ1085] [SCOI2005] 骑士精神 (A*)的更多相关文章

  1. BZOJ1085 SCOI2005 骑士精神【IDA* 启发式迭代加深】

    BZOJ1085 SCOI2005 骑士精神 Description 在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且有一个空位.在任何时候一个骑士都能按照骑士的走法(它可以走到和它横坐 ...

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

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

  3. [BZOJ1085][SCOI2005]骑士精神 搜索

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1085 大的思路是迭代加深搜索,我们加一个明显的剪枝,当棋盘中位置不对的骑士的数目加上已经走 ...

  4. BZOJ1085: [SCOI2005]骑士精神

    传送门 dfs+A*优化. A*是人工智能算法,属于启发式搜索的一部分.第一次知道这个名词是在写虫食算的时候闵神说这个用A*搞跑的比谁都快..但是当时搜了很多资料想搞清楚这个东西,但是当时还是太拿衣服 ...

  5. BZOJ1085 [SCOI2005]骑士精神(IDA*)

    IDA*是IDS的基础上加上满足A*算法的估值函数来剪枝的搜索算法. 这题代码量挺少的,可以看出整个IDA*的框架: #include<cstdio> #include<cstrin ...

  6. bzoj1085 [SCOI2005]骑士精神——IDA*

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1085 搜索,IDA*,估价就是最少需要跳的步数: 代码意外地挺好写的,memcmp 用起来好 ...

  7. 【BZOJ1085】[SCOI2005]骑士精神 双向BFS

    [BZOJ1085][SCOI2005]骑士精神 Description 在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且有一个空位.在任何时候一个骑士都能按照骑士的走法(它可以走到和它 ...

  8. 【bzoj1085】[SCOI2005]骑士精神

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

  9. BZOJ 1085: [SCOI2005]骑士精神( IDDFS + A* )

    一开始写了个 BFS 然后就 T 了... 这道题是迭代加深搜索 + A* -------------------------------------------------------------- ...

随机推荐

  1. docker 报错:x509: certificate has expired or is not yet valid

    环境:centos 7 程序:docker 下载镜像报错: # docker pull centos Pulling repository centos FATA[0004] Get https:// ...

  2. Chrome Stylist 插件 (CSS备份)

    Stylist 插件还是很好用的,可以给网站自定义CSS样式,(还有个插件叫"油猴子",可以给网页加载自定义JS): 不过麻烦的是,现在的最新版360浏览器不能显示这个插件(这个浏 ...

  3. spring,property not found on type

    刚开始学spring mvc ,遇到这个报错. jsp页面 user 实体类 public class User { private String name; private int age; pri ...

  4. C# 使用 SmtpClient 发送邮件注意项

    最近有邮件发送需求,使用 C#  SmtpClient 对象发送邮件 , 报异常, 如下错误代码: 调整代码顺序后,发送邮件成功! 注意:一定要先设置 EnableSsl和UseDefaultCred ...

  5. 深入研究Node.js的底层原理和高级使用

    深入研究Node.js的底层原理和高级使用

  6. LINUX signal 信号

    body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...

  7. 个人觉得实用的Python姿势

    以后会陆续补充 偶然在Python Cookbook看到一个format操作,想到一个问题, 感觉用了!r之后,会把传入的对象按照原来形式保留 d = {"foo": " ...

  8. openstack-ocata-计算服务4

    一. 计算服务概览 使用OpenStack计算服务来托管和管理云计算系统.OpenStack计算服务是基础设施即服务(IaaS)系统的主要部分,模块主要由Python实现. OpenStack计算组件 ...

  9. dojo实现省份地市级联报错(一)

  10. R语言与格式、日期格式、格式转化

    每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- R语言的基础包中提供了两种类型的时间数据,一类 ...