洛谷 P2324 [SCOI2005]骑士精神 解题报告
P2324 [SCOI2005]骑士精神
题目描述
输入输出格式
输入格式:
第一行有一个正整数T(T<=10),表示一共有N组数据。接下来有T个5×5的矩阵,0表示白色骑士,1表示黑色骑士,*表示空位。两组数据之间没有空行。
输出格式:
对于每组数据都输出一行。如果能在15步以内(包括15步)到达目标状态,则输出步数,否则输出-1。
一看到15,莫名的想到迭代加深。
然后发现这个玩意12都跑不过去。想过估价函数,但感觉操作次数会很多就放弃了。
实际上这个题的重点就是估价函数
设估价函数为与目标状态不同的点的个数+1(这个+1是为了最后一步空白的)
然后跑IDA* 就行了(事实是A*更快)
Code:
#include <cstdio>
const int N=6;
int t,sta[N][N],step,ex,ey,flag;
int to[N][N]=
{
{0,0,0,0,0,0},
{0,1,1,1,1,1},
{0,-1,1,1,1,1},
{0,-1,-1,0,1,1},
{0,-1,-1,-1,-1,1},
{0,-1,-1,-1,-1,-1},
};
inline int estimate()
{
int res=0;
for(int i=1;i<=5;i++)
for(int j=1;j<=5;j++)
if(to[i][j]!=sta[i][j])
res++;
return res;
}
int dx[9]={0,-2,-1,1,2,2,1,-1,-2};
int dy[9]={0,1,2,2,1,-1,-2,-2,-1};
inline void Swap(int &x,int &y)
{
int tmp=x;
x=y;
y=tmp;
}
void dfs(int dep,int x,int y)
{
if(flag) return;
if(estimate()+dep>step+1) return;
if(step==dep){flag=1;return;}
for(int i=1;!flag&&i<=8;i++)
{
int X=x+dx[i],Y=y+dy[i];
if(X>0&&Y>0&&X<=5&&Y<=5)
{
Swap(sta[x][y],sta[X][Y]);
dfs(dep+1,X,Y);
Swap(sta[x][y],sta[X][Y]);
}
}
}
void work()
{
flag=0;
if(estimate()==0) {printf("0\n");return;}
for(step=1;step<=15;step++)
{
dfs(0,ex,ey);
if(flag)
{
printf("%d\n",step);
return;
}
}
printf("-1\n");
}
int main()
{
scanf("%d",&t);
while(t--)
{
for(int i=1;i<=5;i++)
{
scanf("\n");
for(int j=1;j<=5;j++)
{
char c;
scanf("%c",&c);
if(c=='*') ex=i,ey=j,sta[i][j]=0;
else if(c=='1') sta[i][j]=1;
else sta[i][j]=-1;
}
}
work();
}
return 0;
}
2018.8.2
洛谷 P2324 [SCOI2005]骑士精神 解题报告的更多相关文章
- 洛谷 P2324 [SCOI2005]骑士精神
题目描述 输入输出格式 输入格式: 第一行有一个正整数T(T<=10),表示一共有N组数据.接下来有T个5×5的矩阵,0表示白色骑士,1表示黑色骑士,*表示空位.两组数据之间没有空行. 输出格式 ...
- 洛谷P2324 [SCOI2005] 骑士精神
题目 方法很多,最经典的是用搜索的算法,也就是\(IDA*\)算法搜索. \(IDA*\)算法是每次规定一个搜索深度,并在搜索的时候限制该搜索深度,从而达到把深搜的优点和广搜的优点结合起来优化时间的一 ...
- [luogu P2324] [SCOI2005]骑士精神
[luogu P2324] [SCOI2005]骑士精神 题目描述 输入输出格式 输入格式: 第一行有一个正整数T(T<=10),表示一共有N组数据.接下来有T个5×5的矩阵,0表示白色骑士,1 ...
- P2324 [SCOI2005]骑士精神(A*)
P2324 [SCOI2005]骑士精神 A*与爆搜的不同就是它有一个估价函数$h(x)$ 这个估价函数一般设为从当前状态到终点状态的估计最短步数,这样可以有效剪枝 但估计值必须严格小于等于实际剩余步 ...
- 洛谷_Cx的故事_解题报告_第四题70
1.并查集求最小生成树 Code: #include <stdio.h> #include <stdlib.h> struct node { long x,y,c; ...
- 洛谷 P2317 [HNOI2005]星际贸易 解题报告
P2317 [HNOI2005]星际贸易 题目描述 输入输出格式 输入格式: 输出格式: 如果可以找到这样的方案,那么输出文件output.txt中包含两个整数X和Y.X表示贸易额,Y表示净利润并且两 ...
- 洛谷 P3802 小魔女帕琪 解题报告
P3802 小魔女帕琪 题目背景 从前有一个聪明的小魔女帕琪,兴趣是狩猎吸血鬼. 帕琪能熟练使用七种属性(金.木.水.火.土.日.月)的魔法,除了能使用这么多种属性魔法外,她还能将两种以上属性组合,从 ...
- 洛谷 P2606 [ZJOI2010]排列计数 解题报告
P2606 [ZJOI2010]排列计数 题目描述 称一个\(1,2,...,N\)的排列\(P_1,P_2...,P_n\)是\(Magic\)的,当且仅当对所以的\(2<=i<=N\) ...
- 洛谷1303 A*B Problem 解题报告
洛谷1303 A*B Problem 本题地址:http://www.luogu.org/problem/show?pid=1303 题目描述 求两数的积. 输入输出格式 输入格式: 两个数 输出格式 ...
随机推荐
- windows安装logstash-input-jdbc并使用其导入MMSQL数据
1.安装logstash 2.修改logstash 文件夹下Gemfile文件 将source改为:https://gems.ruby-china.org 3.进入bin目录 执行logstash-p ...
- Spring 配置String转Date
操作步骤: 1. 实现 org.springframework.core.convert.converter.Converter 接口 2. 配置 org.springframework.contex ...
- HDU - 6444(单调队列+思维)
链接:HDU - 6444 题意:给出一个包含 n 个数的环,每个数都有一个价值,起点任选,每次跳顺时针跳 k 个数,在哪个数就能获得该价值(包括起点),最多取 m 次,问最少需要补充多少价值,所拿的 ...
- 【movable-area、movable-view】 可移动区域组件说明
movable-area.movable-view 可移动区域组件 原型: <movable-area scale-area="[Boolean]"> <mova ...
- python读取日志,存入mysql
1.从 http://www.almhuette-raith.at/apache-log/access.log 下载 1万条日志记录,保存为一个文件,读取文件并解析日志,从日志中提取ip, time_ ...
- 隐马尔科夫模型(hidden Markov Model)
万事开头难啊,刚开头确实不知道该怎么写才能比较有水平,这篇博客可能会比较长,隐马尔科夫模型将会从以下几个方面进行叙述:1 隐马尔科夫模型的概率计算法 2 隐马尔科夫模型的学习算法 3 隐马尔科夫模型 ...
- C语言链接数据库
一.解释一下函数功能和用法 1.mysql_real_connect 函数原型:MYSQL *mysql_real_connect(MYSQL *mysql, const char *host, co ...
- oraclize预言机资料
oraclize预言机资料 智能合约如何可信的与外部世界交互: https://blog.csdn.net/sportshark/article/details/77477842 国外一篇讲得很详细的 ...
- 创新手机游戏《3L》开发点滴(1)——道具、物品、装备表设计
一.游戏物品/道具系统数据模型设计特点 为了让游戏更加的丰富,我们1201团队的新手机游戏设计了道具系统.于是丰富了游戏.取悦了玩家,哭了开发——道具/物品数据子系统是简单的.复杂的.不确定的: 简单 ...
- Ext JS 6学习文档-第4章-数据包
Ext JS 6学习文档-第4章-数据包 数据包 本章探索 Ext JS 中处理数据可用的工具以及服务器和客户端之间的通信.在本章结束时将写一个调用 RESTful 服务的例子.下面是本章的内容: 模 ...