BZOJ 1085: [SCOI2005]骑士精神(A*算法)
第一次写A*算法(这就是A*?如果这就是A*的话,那不就只是搜索的一个优化了= =,不过h函数如果弄难一点真的有些难设计)
其实就是判断t+h(x)(t为当前步数,h(x)为达到当前状态的最小步数) 是否小于当前答案k罢了
已经连续几道题因为一些小问题而调了很久了,不能这样啊QAQ
CODE:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int ans[5][5]={{1,1,1,1,1},{0,1,1,1,1},{0,0,2,1,1},{0,0,0,0,1},{0,0,0,0,0}};
int xx[8]={1,-1,2,-2,1,-1,2,-2};
int yy[8]={2,2,1,1,-2,-2,-1,-1};
int a[5][5];
int k=16;
int judge(int a[5][5]){
for (int i=0;i<5;i++)
for (int j=0;j<5;j++)
if (a[i][j]!=ans[i][j]) return 0;
return 1;
}
int eva(int a[5][5],int t){
int l=0;
for (int i=0;i<5;i++)
for (int j=0;j<5;j++)
if (a[i][j]!=ans[i][j]) l++;
if (l+t>=k) return 0;
return 1;
}
bool flag;
int search(int t,int a[5][5],int x,int y){
if (t>=k) return 0;
if (judge(a)) {flag=1;k=min(k,t);return 0;}
for (int i=0;i<8;i++){
int nowx=x+xx[i],nowy=y+yy[i];
if (nowx>=0&&nowx<5&&nowy>=0&&nowy<5) {
swap(a[x][y],a[nowx][nowy]);
if (eva(a,t)) search(t+1,a,nowx,nowy);
swap(a[x][y],a[nowx][nowy]);
}
}
return 0;
}
int main(){
int t,x,y;
scanf("%d",&t);
while (t--){
flag=0;k=16;
for (int i=0;i<5;i++) {
char c[10];
scanf("%s",c);
for (int j=0;j<5;j++) {
if (c[j]=='0') a[i][j]=0;
if (c[j]=='1') a[i][j]=1;
if (c[j]=='*') {a[i][j]=2;x=i;y=j;}
}
}
search(0,a,x,y);
if (flag) printf("%d\n",k);
else printf("-1\n");
}
return 0;
}
BZOJ 1085: [SCOI2005]骑士精神(A*算法)的更多相关文章
- Bzoj 1085: [SCOI2005]骑士精神 (dfs)
Bzoj 1085: [SCOI2005]骑士精神 题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1085 dfs + 剪枝. 剪枝方法: ...
- BZOJ 1085 [SCOI2005]骑士精神 【A*启发式搜索】
1085: [SCOI2005]骑士精神 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 2838 Solved: 1663 [Submit][St ...
- BZOJ 1085: [SCOI2005]骑士精神( IDDFS + A* )
一开始写了个 BFS 然后就 T 了... 这道题是迭代加深搜索 + A* -------------------------------------------------------------- ...
- [BZOJ 1085] [SCOI2005] 骑士精神 [ IDA* 搜索 ]
题目链接 : BZOJ 1085 题目分析 : 本题中可能的状态会有 (2^24) * 25 种状态,需要使用优秀的搜索方式和一些优化技巧. 我使用的是 IDA* 搜索,从小到大枚举步数,每次 DFS ...
- bzoj 1085: [SCOI2005]骑士精神
Description 在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士,且有一个空位.在任何时候一个骑士都能按照骑士的走法(它可以走到和它横坐标相差为1,纵坐标相差为2或者横坐标相差为2,纵 ...
- [BZOJ 1085][SCOI2005]骑士精神(IDA*)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1085 分析: 首先第一感觉是宽搜,但是空间需要8^15*5*5,明显不够,又鉴于最大深 ...
- BZOJ.1085.[SCOI2005]骑士精神(迭代加深搜索)
题目链接 最小步数这类,适合用迭代加深搜索. 用空格走代替骑士. 搜索时记录上一步防止来回走. 不需要每次判断是否都在位置,可以计算出不在对应位置的骑士有多少个.而且每次复原一个骑士至少需要一步. 空 ...
- bzoj 1085 [SCOI2005]骑士精神——IDA*
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1085 迭代加深搜索. 估价函数是为了预计步数来剪枝,所以要优于实际步数. 没错,不是为了确定 ...
- bzoj 1085: [SCOI2005]骑士精神 IDA*
题目链接 给一个图, 目标位置是确定的, 问你能否在15步之内达到目标位置. 因为只有15步, 所以直接ida* #include<bits/stdc++.h> using namespa ...
随机推荐
- Java序列化与反序列化,文件操作
参考两篇博客: http://blog.csdn.net/moreevan/article/details/6697777 http://blog.csdn.net/moreevan/article/ ...
- asp.net实现断点续传
C# 断点续传原理与实现 在了解HTTP断点续传的原理之前,让我们先来了解一下HTTP协议,HTTP协议是 一种基于tcp的简单协议,分为请求和回复两种.请求协议是由 客户机(浏览器)向服务器(WEB ...
- gridview里item是textView、Button单击事件相应,以及按下效果的取去除
1.响应事件的区别: gridview的item是textView的时候,gridview的itemonclick事件可以正常相应,但是换了Button后不能,原因如下: public class B ...
- Dictionary使用(转)
1.要使用Dictionary集合,需要导入C#泛型命名空间 System.Collections.Generic(程序集:mscorlib)2.描述 1).从一组键(Key)到一组值(Value)的 ...
- centos5.5關閉ssh保留運行的程序
SSH会话关闭时,ssh所关联的pty关闭,系统会给这个pty所关联的session中的所有进程发送SIGHUP信号, SIGHUP的默认信号处理程序是终止进程,除非进程自己处理了SIGHUP. 解决 ...
- Java 之 web.xml(Java之负基础实战)
多个web.xml会同时生效,先加载tomcat下的web.xml,再加载网站目录下的web.xml. 1.tomcat自带的web.xml 在tomcat的conf目录下 2.自定义web.xml ...
- 限制EditText的输入字数
private EditText edit_student_name; edit_student_name.addTextChangedListener(changeStudentNameWatche ...
- KERNEL32相关函数
CALL DWord Ptr [<&KERNEL32.WriteFile>] kernel32.WriteFile 将数据写入一个文件,也可将这个函数应用于对通信设备.管道.套接字 ...
- UGUI batch 规则和性能优化
UGUI batch 规则和性能优化 (基础) Unity 绘图性能优化 - Draw Call Batching : http://docs.unity3d.com/Manual/DrawCallB ...
- HTML 布局
网站布局 大多数网站会把内容安排到多个列中(就像杂志或报纸那样). 大多数网站可以使用 <div> 或者 <table> 元素来创建多列.CSS 用于对元素进行定位,或者为页面 ...