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 ...
随机推荐
- HDU - 5096 ACM Rank (Treap)
平衡树的题,Treap破之,比较难搞的出现相同题数罚时的情况,解决方法是在每个结点用一个set, 保证结点值的时候可以把题数和罚时保存到一个int里,令v = n*MaxPenaltySum-pena ...
- uva806 Spatial Structures 空间结构 (黑白图像的四分树表示)
input 8 00000000 00000000 00001111 00001111 00011111 00111111 00111100 00111000 -8 9 14 17 22 23 44 ...
- ping请求超(iPV4)
ping请求超(iPV4) arp –a(查看局域网全部IP) cmd 管理员运行 netsh winsock reset(重置Winsock目录借以恢复网络) etsh int ip reset r ...
- 用C#(ASP.Net)在Exchange Server环境下发送邮件
普通的邮件, 用System.Net.Mail 类 或 System.Web.Mail 类 处理即可, 但是Exchange Server 环境下, 这两个类起不了作用-------至少目前我看到的情 ...
- 66. Plus One@python
Given a non-empty array of digits representing a non-negative integer, plus one to the integer. The ...
- JSON.stringify(value[, replacer[, space]])
1. JSON.stringify(value[, replacer[, space]]);value 必需 对象或数组,需要转换成json字符串的数据replacer 可选 函数或数组space 可 ...
- ubuntu下RedisDesktopManager的安装,redis可视化工具
官方网站:https://redisdesktop.com/download 一句命令行解决: sudo snap install redis-desktop-manager 或者直接通过软件管理中心 ...
- 2-python基础
1.第一个程序 新建一个python文件,然后写上代码,运行即可 print("hello world") 2.变量 变量就是存东西,供后面来用的 变量名只能是 字母.数字或下划线 ...
- Linux学习-软件磁盘阵列 (Software RAID)
什么是 RAID 磁盘阵列全名是『 Redundant Arrays of Inexpensive Disks, RAID 』,英翻中的意思是:容错式廉价磁盘阵列.RAID 可以透过一个技术(软件或硬 ...
- linux学习-用户的特殊 shell 与 PAM 模块
特殊的 shell, /sbin/nologin 『无法登入』指的是:『这个使用者无法使用 bash 或其他 shell 来登入系统』而已, 并不是说这个账号就无法使用其他的系统资源! 让某个具有 / ...