首页 > 其他分享 >[SCOI2005] 骑士精神 题解

[SCOI2005] 骑士精神 题解

时间:2022-10-07 17:22:18浏览次数:54  
标签:return int 题解 ans textbf text qquad SCOI2005 骑士

题目描述

解法

采用 IDA* 算法。不移动骑士而移动空格。每次限制深度,然后对每个遍历到的点进行一次估价,估价函数的值即为当前状态和终点的差异数。

如果估计的加上已经确认的层数比限制搜索的还要多,就直接放弃这个了。

\[\begin{array}{ll} 1 & \textbf{IDA* (point p, w, k) :}\\ 2 & \qquad w \leftarrow f(s).\\ 3 & \qquad \textbf{if } f(s) = 0 :\\ 4 & \qquad \qquad ans \leftarrow g.\\ 5 & \qquad \qquad \textbf{Return.}\\ 6 & \qquad \textbf{if } ans \text{ have a value } \textbf{or } (w + g)\ge k :\\ 7 & \qquad \qquad \textbf{Return.}\\ 8 & \qquad \textbf{for} \text{ every legal position of }(x, y):\\ 9 & \qquad \qquad \text{swap}(p, (x,y)).\\ 10 & \qquad \qquad \text{IDA*}((x,y),w+1,k).\\ 11 & \qquad \qquad \text{swap}(p, (x,y)).\\ \end{array} \]

代码

#include <iostream>
#include <cstdio>
#include <algorithm>

using namespace std;

const int tg[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 g[6][6];

int f() {
	int cnt = 0;
	for(int i = 1; i <= 5; i ++)
		for(int j = 1; j <= 5; j ++)
			if(g[i][j] != tg[i][j])
				cnt ++;
	return cnt;
}

inline int safe(int x, int y){
    if(x < 1 || x > 5 || y < 1 || y > 5) return 0;
    return 1;
}

int dx[9] = {1, 1, -1, -1, 2, 2, -2, -2};
int dy[9] = {-2, 2, 2, -2, 1, -1, -1, 1};

int ans;

void dfs(int k, int x, int y, int w) {
	int val = f();
	if(!val) {
		ans = w;
		return;
	}
	if(w + val > k || ans || w == k) return;
	for(int i = 0; i < 8; i ++) {
		int X = x + dx[i];
		int Y = y + dy[i];
		if(!safe(X, Y)) continue;
		swap(g[x][y], g[X][Y]);
		dfs(k, X, Y, w + 1);
		swap(g[x][y], g[X][Y]);
	}
}

void solve() {
	int x = 0, y = 0;
	ans = 0;
	for(int i = 1; i <= 5; i ++)
		for(int j = 1; j <= 5; j ++) {
			char ch;
			cin >> ch;
			if(ch == '*') x = i, y = j, g[i][j] = 2;
			else g[i][j] = ch - '0';
		}
	if(!f()) {
		printf("0\n");
		return;
	}
	for(int k = 1; k <= 16; k ++) {
		dfs(k, x, y, 0);
		if(ans) {
			printf("%d\n", ans);
			return;
		}
	}
	printf("-1\n");
}

int main() {
	int t;
	cin >> t;
	while(t --) solve();
}

标签:return,int,题解,ans,textbf,text,qquad,SCOI2005,骑士
From: https://www.cnblogs.com/Inversentropir-36/p/16760104.html

相关文章

  • P2467 地精部落 题解
    P2467地精部落题解比较恶心的一道线性dp。要求1~N的排列,满足a[i-1]<a[i]>a[i+1]或a[i-1]>a[i]<a[i+1],求这样的排列的个数。既然是线性dp,那么状态一定和长度有关,一维的......
  • 答题比赛难题解析(2)
    1、以下说法中正确的个数是():1)实体-关系图和数据流图也可以描述分析模型2)和设计工作流的对象相比较,分析工作流的对象的特点是仅存在于内存中,不保存到硬盘3)每个用例映......
  • 答题比赛难题解析(1)
    1、针对某组织流程的改进,以下列出的措施中,可以采取的个数是()1)引进新的业务实体取代现有业务工人的责任2)在现有业务实体上增加新的责任3)引进新的业务工人取代现有业......
  • 「题解」Codeforces 1313E Concatenation with intersection
    考虑这个\(l_1\)一定是\(s\)的开头,\(r_2\)一定是\(t\)的结尾,那么就考虑假如固定了\(l_1,r_2\)之后怎么计算对答案的贡献。一个河狸的想法是,固定\(l_1\)之后可......
  • luogu P6155 修改题解
    P6155题解闲话这是本蒟蒻写的第三篇题解了,前两篇都因为种种原因报废了,求管理过╥﹏╥正片大家好,我是一名STL选手,于是我用了大量STL+O2的代码过了这道题分析我的代码与......
  • JavaWeb505错误,IDEA版问题解决
    问题描述:在学习JavaWeb的过程中,使用JSP文件转至servlet文件的过程中,发现无论如何都无法打开文件JSP文件代码<%@pagecontentType="text/html;charset=UTF-8"%><!DOCTY......
  • SPOJ6059 GCDSQF Another GCD Problem 题解
    题目大意给定两个square-freenumber\(A\)和\(B\)(即没有一个素因子的次数达到\(2\)的数)的01表示形式(即将其有无该素因子排列出来,如\(105=3\times5\times7\),则......
  • [AHOI2022] 钥匙 题解(超详细解密)
    前言青蛙。树上ds好题,运用了很多巧妙的树上问题处理策略。难度2700。题意简述给定一棵\(n\)个点的树,每个节点上要么有一把钥匙,要么有一个宝箱,且钥匙和宝箱都是有颜......
  • CF1256E. Yet Another Division Into Teams 题解 单调队列优化dp
    题目链接:https://codeforces.com/contest/1256/problem/E将\(n\)个数分成若干队,每一队至少包含\(3\)个整数,每一队的代价是最大值与最小值只差,求所有队伍代价之和的最......
  • CF472D题解
    原题CF472DDesignTutorial:InversetheProblem思路概述题意分析给定一个\(n\)点无向图的两两点对之间距离,即经过最短路算法后的邻接矩阵,要求判断原图是否为一个......