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. VMware 增加硬盘ubuntu

    http://blog.csdn.net/Timsley/article/details/50742755

  2. os._exit(), sys.exit(), exit()

    1. sys.exit(n) 退出程序引发SystemExit异常, 可以捕获异常执行些清理工作. n默认值为0, 表示正常退出. 其他都是非正常退出. 还可以sys.exit("sorry ...

  3. Python标准库笔记(8) — pprint模块

    struct模块提供了用于在字节字符串和Python原生数据类型之间转换函数,比如数字和字符串. Python版本: 2.x & 3.x 该模块作用是完成Python数值和C语言结构体的Pyt ...

  4. Flask:操作SQLite3(0.1)

    Windows 10家庭中文版,Python 3.6.4,Flask 1.0.2 本文介绍了第一次在Flask框架中操作SQLite3数据库的测试,参考了官网的文档Using SQLite 3 wit ...

  5. Java项目打war包的方法

    我们可以运用DOS命令来手工打war包: 首先,打开DOS命令行,敲入“jar”,我们发现它提示不是内部或外部的命令这样的错误,这时八成是你的JAVA环境没有配置好,我们可以用JAVA_HOME方式或 ...

  6. irport报表,把数字金额转换成大写人民币金额

    1.编写oracle函数 CREATE OR REPLACE Function MoneyToChinese(Money In Number) Return Varchar2 Is strYuan ) ...

  7. redis持久化的两种方式

    redis是一个内存型数据库.当redis服务器重启时,数据会丢失.我们可以将redis内存中的数据持久化保存到硬盘的文件中. redis持久化有两种机制.RDB与AOF.默认方式是RDB. 1.RD ...

  8. mysql数据库主从同步复制原理

    MySQL的Replication(英文为复制)是一个多MySQL数据库做主从同步的方案,特点是异步复制,广泛用在各种对MySQL有更高性能.更高可靠性要求的场合.与之对应的是另一个同步技术是MySQ ...

  9. 汇编看C函数调用

    http://blog.csdn.net/wishfly/article/details/5022008   简单的函数调用,通过简单的函数调用反汇编可以清楚了解如下 1.栈到底是什么,如何操纵栈的? ...

  10. mysql索引(btree索引和hash索引的区别)

    所有MySQL列类型可以被索引.根据存储引擎定义每个表的最大索引数和最大索引长度.所有存储引擎支持每个表至少16个索引,总索引长度至少为256字节.大多数存储引擎有更高的限制. 索引的存储类型目前只有 ...