【洛谷】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 ...
随机推荐
- Servlet笔记1--概述
JavaEE概述及系统架构分析: (1) JavaEE概述: (2) 系统架构分析:
- LCD时序中设计到的VSPW/VBPD/VFPD/HSPW/HBPD/HFPD总结【转】
转自:https://blog.csdn.net/u011603302/article/details/50732406 下面是我在网上摘录的一些关于LCD信号所需时钟的一些介绍, 描述方式一: 来自 ...
- MySQL 5.6 GTID Replication【转】
一. MySQL 5.6引入了GTID的概念,那么GTID是何方神圣?其实也不复杂,就是一个全局事务标示符.使用GTID时,每次事务提交都会在binlog里生成1个唯一的标示符,它由UUID和事务ID ...
- 纯css进度条,各种兼容
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><HTML><HEAD&g ...
- Extjs6设置Store、Ajax、form的请求方式(GET、POST)
Extjs6 设置Store.Ajax.form的请求方式(GET.POST) Ajax请求和Form的submit方法设置请求方式和原来一样,使用method : 'POST'设置 // 表单提交 ...
- ASP .Net Core系统部署到 CentOS7 64 具体方案
.Net Core 部署到 CentOS7 64 位系统中的步骤 1.安装工具 1.apache 2..Net Core(dotnet-sdk-2.0) 3.Supervisor(进程管理工具,目的是 ...
- simple_tag
from django.template import Library register = Library() @register.simple_tag def func(arg): return ...
- pip3
pip3 install django #安装rabbitmq连接模块 pip3 install pika pip3 install paramiko pip3 install ipython pip ...
- Delphi与Socket
一.Delphi与Socket计算机网络是由一系列网络通信协议组成的,其中的核心协议是传输层的TCPIP和UDP协议.TCP是面向连接的,通信双方保持一条通路,好比目前的电话线,使用telnet登陆B ...
- Ansible之tags介绍
本节内容: tags介绍 一.tags介绍 我们每次改完配置文件,比如上一篇博客中的的apache.yml,没必要把整个playbook都运行一遍,只需要运行改变了的task.我们可以给task一个标 ...