P2324 [SCOI2005]骑士精神

题目描述

输入输出格式

输入格式:

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

输出格式:

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

输入输出样例

输入样例#1: 复制

2
10110
01*11
10111
01001
00000
01011
110*1
01110
01010
00100
输出样例#1: 复制

7
-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*】的更多相关文章

  1. 洛谷 P2324 [SCOI2005]骑士精神 解题报告

    P2324 [SCOI2005]骑士精神 题目描述 输入输出格式 输入格式: 第一行有一个正整数T(T<=10),表示一共有N组数据.接下来有T个5×5的矩阵,0表示白色骑士,1表示黑色骑士,* ...

  2. 洛谷P2324 [SCOI2005] 骑士精神

    题目 方法很多,最经典的是用搜索的算法,也就是\(IDA*\)算法搜索. \(IDA*\)算法是每次规定一个搜索深度,并在搜索的时候限制该搜索深度,从而达到把深搜的优点和广搜的优点结合起来优化时间的一 ...

  3. 洛谷 P2324 [SCOI2005]骑士精神

    题目描述 输入输出格式 输入格式: 第一行有一个正整数T(T<=10),表示一共有N组数据.接下来有T个5×5的矩阵,0表示白色骑士,1表示黑色骑士,*表示空位.两组数据之间没有空行. 输出格式 ...

  4. 【洛谷2324】[SCOI2005]骑士精神 IDA*

    [SCOI2005]骑士精神 描述 在一个\(5×5\)的棋盘上有\(12\)个白色的骑士和\(12\)个黑色的骑士, 且有一个空位.在任何时候一个骑士都能按照骑 士的走法(它可以走到和它横坐标相差为 ...

  5. [BZOJ 1085] [SCOI2005] 骑士精神 [ IDA* 搜索 ]

    题目链接 : BZOJ 1085 题目分析 : 本题中可能的状态会有 (2^24) * 25 种状态,需要使用优秀的搜索方式和一些优化技巧. 我使用的是 IDA* 搜索,从小到大枚举步数,每次 DFS ...

  6. bzoj 1085: [SCOI2005]骑士精神 IDA*

    题目链接 给一个图, 目标位置是确定的, 问你能否在15步之内达到目标位置. 因为只有15步, 所以直接ida* #include<bits/stdc++.h> using namespa ...

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

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

  8. bzoj 1085 [SCOI2005]骑士精神——IDA*

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1085 迭代加深搜索. 估价函数是为了预计步数来剪枝,所以要优于实际步数. 没错,不是为了确定 ...

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

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

随机推荐

  1. Servlet笔记4--ServletConfig接口和ServletContext接口

    ServletConfig接口: ServletContext接口: 代码详解: (1)web.xml配置文件: <?xml version="1.0" encoding=& ...

  2. PE结构详解

    1 基本概念 下表描述了贯穿于本文中的一些概念: 名称 描述 地址 是“虚拟地址”而不是“物理地址”.为什么不是“物理地址”呢?因为数据在内存的位置经常在变,这样可以节省内存开支.避开错误的内存位置等 ...

  3. 在c++中实现反射的初步想法

    最近在思考如何在c++中实现反射.事情的起因是这样的:我们服务器是用c++开发的,如果需要写一些测试用的GM指令的话,需要编写完GM代码后重新编译并且重启进程,工序繁琐且比较耗时.因此就有了想用脚本( ...

  4. mysql备份参数--master-data和--dump-slave的介绍

    [mysql@db2 ~]$ mysqldump -A --master-data=2 > master2.sql[mysql@db2 ~]$ mysqldump -A --master-dat ...

  5. jQuery UI 给button添加ID

    $("#addOrEditApp").dialog({ modal: true ,maxHeight:dialogHeight,width:dialog_width,title: ...

  6. spring boot 中使用redis session

    spring boot 默认的httpsession是存在内存中.这种默认方式有几个缺点:1.当分布式部署时,存在session不一致的问题:2.当服务重启时session就会丢失,这时候用户就需要重 ...

  7. urllib2使用初探

    在入门urllib2之前,我想应该先调研一下urllib与urllib2的区别[1].首先我们要明白的是,这两个模块不可以相互替代.两者都是接受URL请求的模块,但是提供了不同的功能,两个显著的区别是 ...

  8. 洛谷P3378堆

    传送门啦 #include <iostream> #include <cstdio> #include <cstring> #include <algorit ...

  9. 洛谷P3203弹飞绵羊

    传送门啦 非常神奇的分块大法. 每块分 √N 个元素 , 预处理出来:对于每个点,记录两个量:一个是它要弹几次才能出它所在的这个块,另外一个是它弹出这个块后到哪个点. 查询操作:一块一块跳过去 单次复 ...

  10. T-SQL创建前删除已存在存储过程

    --判断是否存在addOneArticle这个存储过程 if Exists(select name from sysobjects where NAME = 'addOneArticle' and t ...