BZOJ1085 luogu2324骑士精神题解
没有什么特别好的办法,只好用搜索去做
因为一次移动最多归位一个骑士
所以可以想到用IDA*,为了简化状态
我们用k,x,y,sum来表示移动了k步,空格在x,y,还用sum个没有归位的情况
然后枚举转移即可
标准的IDA*
# include<cstring>
# include<iostream>
# include<cstdio>
# include<cmath>
# include<cstdio>
# include<algorithm>
using namespace std;
const int mn = ;
int b[mn][mn]={{},
{,,,,,},
{,,,,,},
{,,,-,,},
{,,,,,},
{,,,,,}};
int dx[]={-,-,-,,-,,,};
int dy[]={-,,, ,-,-,-,};
int a[mn][mn];
int t,sx,sy;
int ans=-;
int maxd;
bool check(int k,int x,int y,int sum,int la)
{
if(k+sum>maxd)
return false;
if(sum==)
return true;
bool flag=false;
int xx,yy,p,col;
for(int i=;i<=;i++)
{
if(i!=-la)
{
xx=x+dx[i];
yy=y+dy[i];
p=sum;
if(xx> && xx<= && yy> && yy<=)
{
if(a[xx][yy]==b[xx][yy] && a[xx][yy]!=b[x][y])
p++;
if(a[xx][yy]!=b[xx][yy] && a[xx][yy]==b[x][y])
p--;
if(b[xx][yy]==-)
p--;
if(b[x][y]==-)
p++;
col=a[xx][yy];
a[xx][yy]=-,a[x][y]=col;
flag=check(k+,xx,yy,p,i);
if(flag)
return true;
a[x][y]=-,a[xx][yy]=col;
}
}
}
return false;
}
void ida(int ret)
{
for(maxd=ret;maxd<=;maxd++)//注意此处要到16
{
if(check(,sx,sy,ret,-))
{
ans=maxd-;
return ;
}
}
}
int main()
{
int ret;
char ch;
scanf("%d",&t);
while(t--)
{
ans=-;
ret=;
for(int i=;i<=;i++)
for(int j=;j<=;j++)
{
cin>>ch;
if(ch=='*')
{
a[i][j]=-;
sx=i,sy=j;
}
else a[i][j]=ch-'';
if(a[i][j]!=b[i][j])
ret++;
}
ida(ret);
printf("%d\n",ans);
}
return ;
}
BZOJ1085 luogu2324骑士精神题解的更多相关文章
- BZOJ1085 SCOI2005 骑士精神【IDA* 启发式迭代加深】
BZOJ1085 SCOI2005 骑士精神 Description 在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且有一个空位.在任何时候一个骑士都能按照骑士的走法(它可以走到和它横坐 ...
- BZOJ1085:[SCOI2005]骑士精神——题解+IDA*粗略讲解
http://www.lydsy.com/JudgeOnline/problem.php?id=1085 Description 在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且有一个空 ...
- BZOJ1085: [SCOI2005]骑士精神 [迭代加深搜索 IDA*]
1085: [SCOI2005]骑士精神 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1800 Solved: 984[Submit][Statu ...
- 【日常学习】【IDA*】codevs2449 骑士精神题解
题目描写叙述 Description 在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且有一个空位.在不论什么时候一个骑士都能依照骑士的走法(它能够走到和它横坐标相差为1.纵坐标相差为2或 ...
- [BZOJ1085] [SCOI2005] 骑士精神 (A*)
Description 在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且有一个空位.在任何时候一个骑士都能按照骑士的走法(它可以走到和它横坐标相差为1,纵坐标相差为2或者横坐标相差为2, ...
- [BZOJ1085][SCOI2005]骑士精神 搜索
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1085 大的思路是迭代加深搜索,我们加一个明显的剪枝,当棋盘中位置不对的骑士的数目加上已经走 ...
- BZOJ1085: [SCOI2005]骑士精神
传送门 dfs+A*优化. A*是人工智能算法,属于启发式搜索的一部分.第一次知道这个名词是在写虫食算的时候闵神说这个用A*搞跑的比谁都快..但是当时搜了很多资料想搞清楚这个东西,但是当时还是太拿衣服 ...
- BZOJ1085 [SCOI2005]骑士精神(IDA*)
IDA*是IDS的基础上加上满足A*算法的估值函数来剪枝的搜索算法. 这题代码量挺少的,可以看出整个IDA*的框架: #include<cstdio> #include<cstrin ...
- bzoj1085 [SCOI2005]骑士精神——IDA*
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1085 搜索,IDA*,估价就是最少需要跳的步数: 代码意外地挺好写的,memcmp 用起来好 ...
随机推荐
- 阿里面试题,为什么wait()方法要放在同步块中?
某天我在***的时候,突然有个小伙伴微信上说:“哥,阿里面试又又挂了,被问到为什么wait()方法要放在同步块中,没答出来!” 我顿时觉得**一紧,仔细回顾一下,如果wait()方法不在同步块中,代码 ...
- springcloud:Eureka的使用
1.认识Eureka 服务的管理. 问题分析 在刚才的案例中,itcast-service-provider对外提供服务,需要对外暴露自己的地址.而consumer(调用者)需要记录服务提供者的地址. ...
- Leetcode559.Maximum Depth of N-ary TreeN叉树的最大深度
给定一个 N 叉树,找到其最大深度. 最大深度是指从根节点到最远叶子节点的最长路径上的节点总数. 说明: 树的深度不会超过 1000. 树的节点总不会超过 5000. class Solution { ...
- Gym - 102163M
Gym - 102163M https://vjudge.net/problem/2356949/origin取对数,然后特判特殊情况,就是0的那些情况 #include<iostream> ...
- 记一次PHP 数组基本用法
以前不知道PHP数组可以这样叠加. $b = array( '2' => 'zhang', ); $a = array( ' => 'li' ) + $b; print_r($a); $b ...
- mac 将本地文件上传到vps
打开mac终端 假设通过ssh连接远程vps命令为. ssh root@194.10.10.23 -p92322 (说明:92322表示端口号,一般vps端口号默认是22) 那么复制本地文件到终端的命 ...
- Spring MVC 搭建web项目示例
环境为Eclipse 1:新建Dynamic web project : springMvcDemo 2:下载spring的jar包,把jar包复制到WEB-INF/lib目录下 3.添加配置文件w ...
- ckfinder提示从服务器读取XML数据出错
在web.xml中加入以下配置,具体路径根据工程配置写 <!-- ckfinder --> <servlet> <servlet-name>ConnectorSer ...
- solr高亮及摘要
修改了原文的一点内容:原文地址为:http://www.cnblogs.com/rainbowzc/p/3680343.html 高亮显示 两种方法: 1.在程序里通过设置query返回高亮信息 pu ...
- oracle之FUNCTION拙见
一.介绍 函数(Function)为一命名的存储程序,可带参数(有无均可),有返回值 函数和过程的结构类似,但必须有一个RETURN子句,用于返回函数值. 函数说明要指定函数名.返回值的类型,以及参数 ...