首页 > 其他分享 >【模板】A*

【模板】A*

时间:2022-10-10 16:26:35浏览次数:73  
标签:return int operatorname swap 步数 模板 con

A* 就是给普通的搜索加了一个估价函数 \(\operatorname{f}\)。

定义比较简单:

\(\operatorname{f}(n) = \operatorname{g}(n)+\operatorname{h}(n)\)

其中 \(\operatorname{g}(n)\) 表示当前节点 \(n\) 已经花费的步数,\(\operatorname{h}(n)\) 表示将来需要花费的最小代价(或者说是一个可望而不可及的完美情况所需的步数)。

那么 \(\operatorname{f}(n)\) 表示在现有状态下到达终态最少需要的步数。


例子:\(\textrm{luogu P2324 [SCOI2005]骑士精神}\)

本题估价函数一旦超过 \(15\),那肯定无了,就不必往下搜了。

这也是一种剪枝吧。

#include <iostream>
char 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},
};
char con[6][6];
int evaluate() {
	int res = 0;
	for(int i = 1;i <= 5;++i) 
		for(int j = 1;j <= 5;++j) 
			if(con[i][j] != aim[i][j]) 
				++res;
	return res;
}
int x_move[8] = {1,1,2,2,-1,-1,-2,-2};
int y_move[8] = {2,-2,1,-1,2,-2,1,-1};
int max_depth;
bool IDA_star(int u_x,int u_y,int depth) {
	int perfect = evaluate();
	if(perfect+depth > max_depth+1) 
		return false;
	if(perfect == 0) 
		return true;
	for(int i = 0;i < 8;++i) {
		int v_x = u_x+x_move[i];
		int v_y = u_y+y_move[i];
		if(v_x < 1||v_x > 5||v_y < 1||v_y > 5) 
			continue;
		std :: swap(con[u_x][u_y],con[v_x][v_y]);
		if(IDA_star(v_x,v_y,depth+1)) {
			std :: swap(con[u_x][u_y],con[v_x][v_y]);
			return true;
		}
		std :: swap(con[u_x][u_y],con[v_x][v_y]);
	}
	return false;
}
int T, ans;
int u_x, u_y;
int main() {
	scanf("%d",&T);
	while(T--) {
		for(int i = 1;i <= 5;++i) {
			scanf("%s",con[i]+1);
			for(int j = 1;j <= 5;++j) 
				if(con[i][j] >= '0') 
					con[i][j] -= '0';
				else {
					con[i][j] = 2;
					u_x = i, u_y = j;
				}
		}
		int begin = evaluate();
		if(begin > 15) {
			printf("-1\n");
			continue; 
		}
		ans = -1;
		for(int i = begin-1;i <= 15;++i) {
			max_depth = i;
			if(IDA_star(u_x,u_y,0)) {
				ans = i;
				break;
			}
		}
		printf("%d\n",ans);
	}
	return 0;
}

还有一个经典应用事 k短路

不过时间是假的,因为有更优秀的可并堆做法。


标签:return,int,operatorname,swap,步数,模板,con
From: https://www.cnblogs.com/bikuhiku/p/A_star.html

相关文章

  • 如何使用界面控件DevExpress WinForms自带的UI模板?其实很简单
    DevExpressWinForm拥有180+组件和UI库,能为WindowsForms平台创建具有影响力的业务解决方案。DevExpressWinForms能完美构建流畅、美观且易于使用的应用程序,无论是Office......
  • 微信小程序模板消息测试- formId 的获取
    微信小程序模板消息测试-formId的获取找到官方文档中form组件的位置:https://developers.weixin.qq.com/miniprogram/dev/component/form.html   点击“在开发......
  • 设计模式-行为型模式之模板方法
    定义抽象基类,规范接口内部方法执行顺序在进阶篇中,没专门提过抽象基类,在这里顺便就提一下抽象基类的核心特征:不能被直接实例化相反,抽象基类和元类一样,一般都被当......
  • P3387 【模板】缩点
    P3387我的做法就是将原图缩点,得到一个DAG新图,在新图上进行DP求最长路径。1#include<bits/stdc++.h>2usingnamespacestd;3constintN=1e5+10;4intn,......
  • Vue2.0后台项目模板
    后台项目项目模板1.简洁版:https://github.com/PanjiaChen/vue-admin-template2.完整版:https://github.com/PanjiaChen/vue-element-admin下载依赖cnpminstallcnpmi......
  • LOJ#162 【模板】光速幂
    题意这可能也是一道模板题。给出正整数\(x\)和\(n\)个正整数\(a_i\),求\(x^{a_i}\bmodp\)。对于\(100\%\)的数据,\(1\leqn\leq5\times10^6,1\leqx,a_i<p,p=......
  • 差分约束模板补坑与学习
    很久以前就学了差分约束,但是一直没搞懂,也懒得搞懂。今天看板子,脑补了几秒钟突然就懂了。对于一个不等式,\(x_i-x_j\lek\),可以变形:\(x_i\lex_j+k\)。这跟最短......
  • P3388 【模板】割点(割顶)
    【模板】割点(割顶)题目背景割点题目描述给出一个\(n\)个点,\(m\)条边的无向图,求图的割点。输入格式第一行输入两个正整数\(n,m\)。下面\(m\)行每行输入两个正整......
  • 模板引擎
    1、模板引擎的步骤1.1语法通过{{}}进行变量的输出:三元、对象属性、数组、表达式等点击查看代码<!DOCTYPEhtml><htmllang="en"><head><metacharset="UT......
  • idea -- mybaties -- 模板下载
    1,ctroller-->如下@GetMapping(value="/createTlzExcel")publicStringcreateTlzExcel(HttpServletResponseresponse)throwsException{Map<String,Object>exc......