BZOJ-1085 骑士精神
估价函数其实就是与目标状态有几个不同。。。
迭代启发搜索。
#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 骑士精神的更多相关文章
- bzoj 1085骑士精神
bzoj 1085骑士精神 在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士,且有一个空位.在任何时候一个骑士都能按照骑士的走法(它可以走到和它横坐标相差为1,纵坐标相差为2或者横坐标相差为2 ...
- A*算法详解 BZOJ 1085骑士精神
转载1:A*算法入门 http://www.cppblog.com/mythit/archive/2009/04/19/80492.aspx 在看下面这篇文章之前,先介绍几个理论知识,有助于理解A*算 ...
- BZOJ 1085 骑士精神 迭代加深搜索+A*
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1085 题目大意: 在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且有一个 ...
- bzoj 1085骑士精神 迭代深搜
题目传送门 题目大意:给出一幅棋盘,问能否复原,中文题面,不做解释. 思路:第一次写迭代深搜的题目,这道题还是挺经典的.这道题的状态很明显的每多搜一层就是多八倍,非常的多,而且又是t组输入,所以必定有 ...
- [BZOJ]1085 骑士精神(SCOI2005)
这种鲜明的玄学风格很明显就是十几年前的题目. Description 在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且有一个空位.在任何时候一个骑士都能按照骑士的走法(它可以走到和它横坐 ...
- [bzoj] 1085 骑士精神 || ID-DFS
原题 找到最少的步数成为目标状态. IDDFS(限制层数的dfs)即可 #include<cstdio> #include<algorithm> using namespace ...
- BZOJ SCOI2005骑士精神
裸IDA*,ans从1到15循环来限制搜索深度. #include<cstdio> #include<cstring> #include<algorithm> us ...
- Bzoj 1085: [SCOI2005]骑士精神 (dfs)
Bzoj 1085: [SCOI2005]骑士精神 题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1085 dfs + 剪枝. 剪枝方法: ...
- 【BZOJ】1085: [SCOI2005]骑士精神(A*启发式搜索)
http://www.lydsy.com/JudgeOnline/problem.php?id=1085 囧啊囧,看了题解后写了个程序,但是样例总过不了T+T,调试了不下于1个小时,肉眼对拍看了根本看 ...
- [BZOJ 1085] [SCOI2005] 骑士精神 [ IDA* 搜索 ]
题目链接 : BZOJ 1085 题目分析 : 本题中可能的状态会有 (2^24) * 25 种状态,需要使用优秀的搜索方式和一些优化技巧. 我使用的是 IDA* 搜索,从小到大枚举步数,每次 DFS ...
随机推荐
- 唱吧APP产品体验报告
- Android(java)学习笔记118:BroadcastReceiver之 外拨电话的广播接收者
1. 外拨电话的广播接收者: 首先我们示例工程一览表如下: (2)首先我们还是买一个收音机,定义一个OutCallReceiver继承自BroadcastReceiver,onReceive()方法中 ...
- VS2013常用快捷键[转] 注释 Ctrl+K - C 和 k - u
VS2013常用快捷键你敢不会? F1 帮助文档 F5 运行 F12 跳转到定义 F11 单步调试 Shift+F5 停止调试 Ctrl+滚轮 放大缩小当前视图 Ctrl+L 删除当前行 Ctrl ...
- 从 Objective-C 里的 Alloc 和 AllocWithZone 谈起
一.问题起源 一切起源于Apple官方文档里面关于单例(Singleton)的示范代码:Creating a Singleton Instance.主要的争议集中在下面这一段: static MyGi ...
- TypeError: Cannot read property 'tap' of undefined
E:\vue-project\vue-element-admin-master>npm run build:prod vue-element-admin@3.8.1 build:prod E:\ ...
- 基础的Mapgis三维二次开发-插件式
最近在做一个杭州石油的项目开发一个小系统. 1.命令必须是 ICommand 的派生类 using System; using System.Collections.Generic; using Sy ...
- Postman 没有走hosts文件
问题: 在Windows10系统中,从官方下载Postman安装并登录后,创建一个请求并执行.但这个请求并没有走hosts文件中定义的192.168.33.10主机,而是走到了线上的主机. 分析: 通 ...
- PAT 乙级 1048
题目 题目地址:PAT 乙级 1048 思路 这道题坑的地方在于:即使B的长度小于A,仍然要对B补齐,也就是说最终结果的长度取决于A和B中长度更长的那一项:即只要A.B长度不一致,就要对短的一个进行补 ...
- 【数学 BSGS】bzoj2242: [SDOI2011]计算器
数论的板子集合…… Description 你被要求设计一个计算器完成以下三项任务: 1.给定y,z,p,计算Y^Z Mod P 的值: 2.给定y,z,p,计算满足xy≡ Z ( mod P )的最 ...
- vue-cli3.0相关的坑
vue-cli3.0相对比vue-cli2.0少了 vue-build.js vue-config.js vue-cli2.0 运行命令 npm run devvue-cli3.0 运行命令 npm ...