【洛谷】2324:[SCOI2005]骑士精神【IDA*】
P2324 [SCOI2005]骑士精神
题目描述

输入输出格式
输入格式:
第一行有一个正整数T(T<=10),表示一共有N组数据。接下来有T个5×5的矩阵,0表示白色骑士,1表示黑色骑士,*表示空位。两组数据之间没有空行。
输出格式:
对于每组数据都输出一行。如果能在15步以内(包括15步)到达目标状态,则输出步数,否则输出-1。
输入输出样例
说明

喜欢了!不枉我研究那么久搜索QAQ
不过还是卡了一会儿,因为在估价时不能算空格,空格是跟随别人走的。
然后就是迭代加深和A*的套路了...枚举最大深度,估价剪枝,然后直接暴力跳就行叻!
#include<bits/stdc++.h>
using namespace std; int maxdep; int zl[][] = {{, }, {-, }, {, }, {-, }, {, -}, {-, -}, {, -}, {-, -}}; int st[][], now[][], G[][];
char s[][]; void init() {
for(int i = ; i <= ; i ++)
for(int j = ; j <= ; j ++) {
if(i <= && j >= i) st[i][j] = ;
else if(i <= && j < ) st[i][j] = ;
else if(i == && j == ) st[i][j] = ;
else if(i >= && j <= i) st[i][j] = ;
else st[i][j] = ;
}
} bool check() {
for(int i = ; i <= ; i ++)
for(int j = ; j <= ; j ++) {
if(now[i][j] != st[i][j]) return ;
}
return ;
} int cot(int x, int y) {
int num = ;
for(int i = ; i <= ; i ++)
for(int j = ; j <= ; j ++)
if(st[i][j] != now[i][j] && st[i][j] != ) num ++;
return num;
} bool pd(int x, int y) {
if(x >= && x <= && y >= && y <= ) return ;
return ;
} int fl, flag;
void dfs(int dep, int x, int y) {
if(fl) return ;
if(dep == maxdep) {
if(check()) fl = ;
return ;
}
if(dep + cot(x, y) > maxdep) return ;
for(int i = ; i < ; i ++) {
int xx = x + zl[i][], yy = y + zl[i][];
if(pd(xx, yy)) {
swap(now[x][y], now[xx][yy]);
dfs(dep + , xx, yy);
if(fl) return ;
swap(now[x][y], now[xx][yy]);
}
}
if(fl) return ;
} int main() {
int T;
scanf("%d\n", &T);
init();
while(T --) {
int x, y;
flag = ;
for(int i = ; i <= ; i ++) {
scanf("%s", s[i] + );
}
for(int i = ; i <= ; i ++) {
for(int j = ; j <= ; j ++) {
if(s[i][j] == '') G[i][j] = ;
else if(s[i][j] == '') G[i][j] = ;
else G[i][j] = , x = i, y = j;
}
}
for(maxdep = ; maxdep <= ; maxdep ++) {
fl = ;
for(int i = ; i <= ; i ++)
for(int j = ; j <= ; j ++)
now[i][j] = G[i][j];
dfs(, x, y);
if(fl) {
printf("%d\n", maxdep); flag = ; break;
}
}
if(!flag) printf("-1\n");
}
return ;
}
【洛谷】2324:[SCOI2005]骑士精神【IDA*】的更多相关文章
- 洛谷 P2324 [SCOI2005]骑士精神 解题报告
P2324 [SCOI2005]骑士精神 题目描述 输入输出格式 输入格式: 第一行有一个正整数T(T<=10),表示一共有N组数据.接下来有T个5×5的矩阵,0表示白色骑士,1表示黑色骑士,* ...
- 洛谷P2324 [SCOI2005] 骑士精神
题目 方法很多,最经典的是用搜索的算法,也就是\(IDA*\)算法搜索. \(IDA*\)算法是每次规定一个搜索深度,并在搜索的时候限制该搜索深度,从而达到把深搜的优点和广搜的优点结合起来优化时间的一 ...
- 洛谷 P2324 [SCOI2005]骑士精神
题目描述 输入输出格式 输入格式: 第一行有一个正整数T(T<=10),表示一共有N组数据.接下来有T个5×5的矩阵,0表示白色骑士,1表示黑色骑士,*表示空位.两组数据之间没有空行. 输出格式 ...
- 【洛谷2324】[SCOI2005]骑士精神 IDA*
[SCOI2005]骑士精神 描述 在一个\(5×5\)的棋盘上有\(12\)个白色的骑士和\(12\)个黑色的骑士, 且有一个空位.在任何时候一个骑士都能按照骑 士的走法(它可以走到和它横坐标相差为 ...
- [BZOJ 1085] [SCOI2005] 骑士精神 [ IDA* 搜索 ]
题目链接 : BZOJ 1085 题目分析 : 本题中可能的状态会有 (2^24) * 25 种状态,需要使用优秀的搜索方式和一些优化技巧. 我使用的是 IDA* 搜索,从小到大枚举步数,每次 DFS ...
- bzoj 1085: [SCOI2005]骑士精神 IDA*
题目链接 给一个图, 目标位置是确定的, 问你能否在15步之内达到目标位置. 因为只有15步, 所以直接ida* #include<bits/stdc++.h> using namespa ...
- bzoj1085 [SCOI2005]骑士精神——IDA*
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1085 搜索,IDA*,估价就是最少需要跳的步数: 代码意外地挺好写的,memcmp 用起来好 ...
- bzoj 1085 [SCOI2005]骑士精神——IDA*
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1085 迭代加深搜索. 估价函数是为了预计步数来剪枝,所以要优于实际步数. 没错,不是为了确定 ...
- BZOJ1085: [SCOI2005]骑士精神 [迭代加深搜索 IDA*]
1085: [SCOI2005]骑士精神 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1800 Solved: 984[Submit][Statu ...
随机推荐
- java7与java8中计算两个日期间隔多少年多少月多少天的实现方式
最近工作中碰到个新需求,计算每个员工入职公司的时长,要求形式为多少年多少月多少天形式,某个值为0就跳过不显示,因为前段时间学习过java8新特性,对于这个需求,java8的新时间日期API可以直接解决 ...
- 读书笔记 effective C++ Item 33 避免隐藏继承而来的名字
1. 普通作用域中的隐藏 名字实际上和继承没有关系.有关系的是作用域.我们都知道像下面的代码: int x; // global variable void someFunc() { double x ...
- STL容器 vector,list,deque 性能比较
C++的STL模板库中提供了3种容器类:vector,list,deque对于这三种容器,在觉得好用的同时,经常会让我们困惑应该选择哪一种来实现我们的逻辑.在少量数据操作的程序中随便哪一种用起来感觉差 ...
- window.print打印方法实现
vue中使用window.print打印效果 项目要求 打印每页有10行表格,如果接口数据没有十个显示10行 效果图 第一页 第二页 子组件 <template> <div> ...
- 再谈OPENCV(转)
转自:http://blog.csdn.net/carson2005/article/details/6979806 尽管之前写过一篇关于OpenCV的介绍(http://blog.csdn.net/ ...
- HDU 4632 Palindrome subsequence(区间DP求回文子序列数)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4632 题目大意:给你若干个字符串,回答每个字符串有多少个回文子序列(可以不连续的子串).解题思路: 设 ...
- Dev控件删除按钮的两种方式
测试版本15.2.10:在Dev控件中删除按钮空间有两种方式:1.鼠标右键出现Delete选项,这种删除是不完全的删除,只是删除了按钮的显示,实际上按钮还是存在于代码中的.2.用键盘上的Delete键 ...
- JS黑魔法之this, setTimeout/setInterval, arguments
最近发现了JavaScript Garden这个JS黑魔法收集处,不过里面有一些东西并没有说得很透彻,于是边看边查文档or做实验,写了一些笔记,顺手放在博客.等看完了You don't know JS ...
- jquery跨域请求事例
//js发送跨域请求部分var requesturl = 'url'; $.ajax({ type:'GET', url:requesturl, data:{'qNum':num}, dataType ...
- USACO 6.2 Packing Rectangles
Packing RectanglesIOI 95 The six basic layouts of four rectangles Four rectangles are given. Find th ...