传送门

dfs+A*优化。

A*是人工智能算法,属于启发式搜索的一部分。第一次知道这个名词是在写虫食算的时候闵神说这个用A*搞跑的比谁都快..但是当时搜了很多资料想搞清楚这个东西,但是当时还是太拿衣服,所以拖到了联赛前补一补。

其实A*算法应该是算用于剪枝吧(我什么不懂说错了求不喷QAQ),优化每次扩展搜索树的顺序已达到最理想的效果。在寻路方面有个视频可以很好的反映出A*的优越性:

A*在这里的关键就是如何设置估价函数,因为末状态已知,所以设有多少个点和答案不同为估价函数。

//BZOJ 1085
//by Cydiater
//2016.10.11
#include <iostream>
#include <cstring>
#include <string>
#include <algorithm>
#include <queue>
#include <map>
#include <ctime>
#include <cmath>
#include <cstdlib>
#include <iomanip>
#include <cstdio>
using namespace std;
#define ll long long
#define up(i,j,n)		for(int i=j;i<=n;i++)
#define down(i,j,n)		for(int i=j;i>=n;i--)
const int MAXN=1e6+5;
const int oo=0x3f3f3f3f;
const int N=5;
const int dx[8]={1,1,-1,-1,2,2,-2,-2};
const int dy[8]={2,-2,2,-2,1,-1,1,-1};
inline int read(){
	char ch=getchar();int x=0,f=1;
	while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
	return x*f;
}
int aim[6][6]={
	{0,0,0,0,0,0},
	{0,1,1,1,1,1},
	{0,0,1,1,1,1},
	{0,0,0,2,1,1},
	{0,0,0,0,0,1},
	{0,0,0,0,0,0}
};
int a[6][6],b[6][6],T,stx,sty;
bool OK=0;
namespace solution{
	void print(){
		up(i,1,5){
			up(j,1,5)printf("%d ",a[i][j]);
			printf("\n");
		}
		puts("");
	}
	void init(){
		up(i,1,N){
			scanf("\n");
			up(j,1,N){
				char ch;scanf("%c",&ch);
				if(ch=='1')a[i][j]=1;
				if(ch=='0')a[i][j]=0;
				if(ch=='*'){
					a[i][j]=2;
					stx=i;sty=j;
				}
			}
		}
		memcpy(b,a,sizeof(a));
	}
	bool check(int now,int lim){
		int cnt=0;
		up(i,1,5)up(j,1,5)if(a[i][j]!=aim[i][j])cnt++;
		if(cnt+now>lim)return 0;
		return 1;
	}
	bool judge(){
		up(i,1,5)up(j,1,5)if(aim[i][j]!=a[i][j])return 0;
		return 1;
	}
	void dfs(int x,int y,int dep,int depth){
		//if(depth==7)print();
		if(dep==depth)if(judge()){
			OK=1;return;
		}
		if(OK)return;
		up(i,0,15){
			int tx=x+dx[i],ty=y+dy[i];
			if(tx>5||tx<1||ty>5||ty<1)continue;
			swap(a[x][y],a[tx][ty]);
			if(check(dep,depth))dfs(tx,ty,dep+1,depth);
			swap(a[x][y],a[tx][ty]);
		}
	}
	void slove(){
		OK=0;
		up(dep,1,15){
			memcpy(a,b,sizeof(b));
			dfs(stx,sty,0,dep);
			if(OK){
				cout<<dep<<endl;
				break;
			}
		}
		if(!OK)puts("-1");
	}
}
int main(){
	//freopen("input.in","r",stdin);
	//freopen("out.out","w",stdout);
	using namespace solution;
	T=read();
	while(T--){
		init();
		slove();
	}
	return 0;
}

BZOJ1085: [SCOI2005]骑士精神的更多相关文章

  1. BZOJ1085 SCOI2005 骑士精神【IDA* 启发式迭代加深】

    BZOJ1085 SCOI2005 骑士精神 Description 在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且有一个空位.在任何时候一个骑士都能按照骑士的走法(它可以走到和它横坐 ...

  2. BZOJ1085: [SCOI2005]骑士精神 [迭代加深搜索 IDA*]

    1085: [SCOI2005]骑士精神 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1800  Solved: 984[Submit][Statu ...

  3. [BZOJ1085] [SCOI2005] 骑士精神 (A*)

    Description 在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且有一个空位.在任何时候一个骑士都能按照骑士的走法(它可以走到和它横坐标相差为1,纵坐标相差为2或者横坐标相差为2, ...

  4. [BZOJ1085][SCOI2005]骑士精神 搜索

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1085 大的思路是迭代加深搜索,我们加一个明显的剪枝,当棋盘中位置不对的骑士的数目加上已经走 ...

  5. BZOJ1085 [SCOI2005]骑士精神(IDA*)

    IDA*是IDS的基础上加上满足A*算法的估值函数来剪枝的搜索算法. 这题代码量挺少的,可以看出整个IDA*的框架: #include<cstdio> #include<cstrin ...

  6. bzoj1085 [SCOI2005]骑士精神——IDA*

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1085 搜索,IDA*,估价就是最少需要跳的步数: 代码意外地挺好写的,memcmp 用起来好 ...

  7. 【BZOJ1085】[SCOI2005]骑士精神 双向BFS

    [BZOJ1085][SCOI2005]骑士精神 Description 在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且有一个空位.在任何时候一个骑士都能按照骑士的走法(它可以走到和它 ...

  8. 【bzoj1085】[SCOI2005]骑士精神

    1085: [SCOI2005]骑士精神 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1757  Solved: 961[Submit][Statu ...

  9. BZOJ 1085: [SCOI2005]骑士精神( IDDFS + A* )

    一开始写了个 BFS 然后就 T 了... 这道题是迭代加深搜索 + A* -------------------------------------------------------------- ...

随机推荐

  1. js基础知识温习:Javascript中如何模拟私有方法

    本文涉及的主题虽然很基础,在很多人眼里属于小伎俩,但在JavaScript基础知识中属于一个综合性的话题.这里会涉及到对象属性的封装.原型.构造函数.闭包以及立即执行表达式等知识. 公有方法 公有方法 ...

  2. 阅读DNA-2014年读书

  3. Google 面试

    坚持完成这套学习手册,你就可以去 Google 面试了 系统 指针 value Google 面试 阅读10266   本文为掘金投稿,译文出自:掘金翻译计划 原文地址:Google Intervie ...

  4. 东大OJ-1544: GG的战争法则

    题目描述 你在桥上看风景 看风景的人在楼上看你 明月装饰了你的窗子 你装饰了我的梦 这是GG在长坂坡发出的感叹. 三年前GG莫名的穿越到了三国时期,在这三年里他看尽了各种杀戮,心里早已麻木.GG他渴望 ...

  5. android 布局之scrollview

    今天在布局页面的时候后犯了难,我要显示的内容一个页面展示不完,怎么办呢? 于是随便找了个app点开一看,哎呀原来还能翻动啊!这是啥布局呢?原来是ScrollView 官方api相关的内容全是英文,这可 ...

  6. redis在window环境下的安装

    1.下载客户端文件 地址:https://github.com/dmajkic/redis/downloads 客户端文件目录说明: 2.启动redis服务端 1.在客户端文件目录下新建一个bat文件 ...

  7. 云平台 为什么推荐使用小VM 而不是大VM独占宿主机的方式部署游戏服?

    近期公司X游戏项目,提了一个游戏VM资源的需求,是 64GB RAM + 30Core CPU 的VM规格,而一个VM部署10个游戏服.而我们云平台推荐的VM规格为 4 Core CPU + 4GB ...

  8. sqlite之聚合函数的使用

    聚合函数对一组值执行计算并返回单一的值.聚合函数对一组值执行计算,并返回单个值.除了 COUNT 以外,聚合函数都会忽略空值. 聚合函数经常与 SELECT 语句的 GROUP BY 子句一起使用. ...

  9. [Elasticsearch] 全文搜索 (一) 基础概念和match查询

    全文搜索(Full Text Search) 现在我们已经讨论了搜索结构化数据的一些简单用例,是时候开始探索全文搜索了 - 如何在全文字段中搜索来找到最相关的文档. 对于全文搜索而言,最重要的两个方面 ...

  10. .net的Hello World之旅

    class Program    {        //这是主函数,是程序的入口        static void Main(string[] args)        {            ...