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]骑士精神 解题报告的更多相关文章

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

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

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

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

  3. [luogu P2324] [SCOI2005]骑士精神

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

  4. P2324 [SCOI2005]骑士精神(A*)

    P2324 [SCOI2005]骑士精神 A*与爆搜的不同就是它有一个估价函数$h(x)$ 这个估价函数一般设为从当前状态到终点状态的估计最短步数,这样可以有效剪枝 但估计值必须严格小于等于实际剩余步 ...

  5. 洛谷_Cx的故事_解题报告_第四题70

    1.并查集求最小生成树 Code: #include <stdio.h> #include <stdlib.h>   struct node {     long x,y,c; ...

  6. 洛谷 P2317 [HNOI2005]星际贸易 解题报告

    P2317 [HNOI2005]星际贸易 题目描述 输入输出格式 输入格式: 输出格式: 如果可以找到这样的方案,那么输出文件output.txt中包含两个整数X和Y.X表示贸易额,Y表示净利润并且两 ...

  7. 洛谷 P3802 小魔女帕琪 解题报告

    P3802 小魔女帕琪 题目背景 从前有一个聪明的小魔女帕琪,兴趣是狩猎吸血鬼. 帕琪能熟练使用七种属性(金.木.水.火.土.日.月)的魔法,除了能使用这么多种属性魔法外,她还能将两种以上属性组合,从 ...

  8. 洛谷 P2606 [ZJOI2010]排列计数 解题报告

    P2606 [ZJOI2010]排列计数 题目描述 称一个\(1,2,...,N\)的排列\(P_1,P_2...,P_n\)是\(Magic\)的,当且仅当对所以的\(2<=i<=N\) ...

  9. 洛谷1303 A*B Problem 解题报告

    洛谷1303 A*B Problem 本题地址:http://www.luogu.org/problem/show?pid=1303 题目描述 求两数的积. 输入输出格式 输入格式: 两个数 输出格式 ...

随机推荐

  1. uvaoj 101 - The Blocks Problem(vector应用+技巧)

    https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=835&page= ...

  2. 爬虫——URL模块爬取糗事百科段子

    最简单的爬取网页找有用信息,难点应该是正则锁定有用信息部分,看了一些其他大神的正则,最后还是决定按照自己理解写一个,果然我头脑相对简单,写出来的粗糙而易理解,也完成了自己想要的需求,就这样了~ # - ...

  3. Python常用函数--文档字符串DocStrings

    Python 有一个甚是优美的功能称作python文档字符串(Documentation Strings),在称呼它时通常会使用另一个短一些的名字docstrings.DocStrings 是一款你应 ...

  4. lintcode407 加一

    加一 给定一个非负数,表示一个数字数组,在该数的基础上+1,返回一个新的数组. 该数字按照大小进行排列,最大的数在列表的最前面. 您在真实的面试中是否遇到过这个题? Yes 样例 给定 [1,2,3] ...

  5. 微信小程序 选项 、时间日期选择器

    wxml: <view class="section" > <picker bindchange="bindPickerChange" val ...

  6. Linux内核设计笔记8——下半部

    # 下半部笔记 1. 软中断 软中断实现 软中断是在编译期间静态分配,其结构如下所示,结构中包含一个接受该结构体指针作为参数的action函数. struct softirq_action{ void ...

  7. Python3 小工具-僵尸扫描

    僵尸机的条件: 1.足够闲置,不与其他机器进行通讯 2.IPID必须是递增的,不然无法判断端口是否开放 本实验僵尸机选择的是Windows2003 from scapy.all import * im ...

  8. Java标签实现分页

    Java实现标签分页 最近为了开发一个网站,里面要用分页功能,但是之前很少自己写分页标签,又不想用现成框架.所以自己参考了些资料,写了个分页例子测试了一下. 代码主要分为三个类: PageTag 分页 ...

  9. POJ 1815 Friendship(最大流最小割の字典序割点集)

    Description In modern society, each person has his own friends. Since all the people are very busy, ...

  10. H5页面 绝对定位元素被 软键盘弹出时顶起

    H5页面 绝对定位元素被 软键盘弹出时顶起 在h5页面开发的过程中,我们可能会遇到下面这个问题,当页面中有输入框的时候,系统自带的软盘会把按钮挤出原来的位置.那么我们该怎么解决呢?下面列出一下的方法: ...