[luoguP2324] [SCOI2005]骑士精神(A*?)
传送门
蒟蒻并不懂A*是什么,但是题解里有个Astar
可以看出,当前棋盘和最终的棋盘如果有k个不同的,那么至少需要k-1步来移动
所以如果 当前步数 + k - 1 > limit 就直接退出
然后当然就是用喜闻乐见的迭代加深搜索啦,广搜占空间那么大又难写
最后吐槽一句,为什么我加哈希判重反而比不判重慢。。?
#include <cstdio>
#define swap(x, y) ((x) ^= (y) ^= (x) ^= (y))
#define P 1000007int T, limit;
char s[6][6], t[6][6];
int dx[8] = {-1, -2, -2, -1, 1, 2, 2, 1},dy[8] = {-2, -1, 1, 2, 2, 1, -1, -2};
bool vis[P];inline bool dfs(int k)
{int i, j, sx, sy, x, y, cnt = 0, hash = 0;for(i = 1; i <= 5; i++)for(j = 1; j <= 5; j++){hash = (hash * 17 + s[i][j]) % P;cnt += (s[i][j] != t[i][j]);if(s[i][j] == '*')sx = i, sy = j;}if(!cnt) return 1;cnt--;if(k > limit) return 0;if(vis[hash]) return 0;if(k + cnt - 1 > limit) return 0;for(i = 0; i < 8; i++){x = sx + dx[i];y = sy + dy[i];if(1 <= x && x <= 5 && 1 <= y && y <= 5){swap(s[sx][sy], s[x][y]);if(dfs(k + 1)) return 1;swap(s[sx][sy], s[x][y]);}}return 0;
}int main()
{int i, j;scanf("%d", &T);t[1][1] = '1', t[1][2] = '1', t[1][3] = '1', t[1][4] = '1', t[1][5] = '1';t[2][1] = '0', t[2][2] = '1', t[2][3] = '1', t[2][4] = '1', t[2][5] = '1';t[3][1] = '0', t[3][2] = '0', t[3][3] = '*', t[3][4] = '1', t[3][5] = '1';t[4][1] = '0', t[4][2] = '0', t[4][3] = '0', t[4][4] = '0', t[4][5] = '1';t[5][1] = '0', t[5][2] = '0', t[5][3] = '0', t[5][4] = '0', t[5][5] = '0';vis[151603] = 1;while(T--){limit = 0;for(i = 1; i <= 5; i++)scanf("%s", s[i] + 1);while(limit <= 15){if(dfs(1)){printf("%d\n", limit);break;}limit++;}if(limit > 15) puts("-1");}return 0;
}
转载于:https://www.cnblogs.com/zhenghaotian/p/7641676.html
[luoguP2324] [SCOI2005]骑士精神(A*?)相关推荐
- luoguP2324 [SCOI2005]骑士精神 IDA*
题面 这个题比较简单 直接枚举搜索深度 估价函数为当前棋盘与目标棋盘不同的棋的个数 然后直接迭代加深搜索就可以了 当然还不能走回头路 Codes #include<bits/stdc++.h&g ...
- 洛谷 P2324 [SCOI2005]骑士精神 解题报告
P2324 [SCOI2005]骑士精神 题目描述 输入输出格式 输入格式: 第一行有一个正整数T(T<=10),表示一共有N组数据.接下来有T个5×5的矩阵,0表示白色骑士,1表示黑色骑士,* ...
- BZOJ 1085 [SCOI2005]骑士精神 【A*启发式搜索】
1085: [SCOI2005]骑士精神 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 2838 Solved: 1663 [Submit][St ...
- bzoj 1085: [SCOI2005]骑士精神(IDA*)
1085: [SCOI2005]骑士精神 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 2296 Solved: 1328 [Submit][St ...
- bzoj1085: [SCOI2005]骑士精神(a*)
1085: [SCOI2005]骑士精神 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 2555 Solved: 1472 [Submit][St ...
- [启发式搜索/A*] [SCOI2005]骑士精神题解
洛谷-骑士精神 启发式搜索-A* 估价函数 对于当前状态,我们可以将其与目标状态对比,得到一个预估的代价,即最少(不一定满足题意)的代价,得到这个代价的函数叫做估价函数 对于一个最短路问题来说,我们可 ...
- BZOJ1085 [SCOI2005] 骑士精神
[问题描述] 在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且有一个空位.在任何时候一个骑士都能按照骑 士的走法(它可以走到和它横坐标相差为1,纵坐标相差为2或者横坐标相差为2,纵坐标相 ...
- 【题解】P2324[SCOI2005] 骑士精神
Description 在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且有一个空位. 在任何时候一个骑士都能按照骑 士的走法(它可以走到和它横坐标相差为1,纵坐标相差为2或者横坐标相差为 ...
- [A*,启发式搜索] [SCOI2005] 骑士精神
链接:https://ac.nowcoder.com/acm/problem/20247 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言5242 ...
最新文章
- 一文清晰讲解机器学习中梯度下降算法(包括其变式算法)
- PHP学习笔记-字符串操作1
- MySQL中优化sql语句查询常用的30种方法
- C十六: 两个指针相减
- AngularJS:在Windows上安装Yeoman
- 【深度学习】深度学习中的单元测试
- BugkuCTF-WEB题cookie欺骗
- Android性能优化之内存篇
- ubuntu18常用软件安装设置
- 需求文档2_The Battle of Polytopia
- inode客户端连接成功上不了网_iNode智能客户端常见问题及解决办法
- urllib库(三)parse模块:quote()/quote_plus(),unquote()/unquote_plus(),quote_from_bytes()
- Java jmeter集成测试
- 主动学习与自监督学习结合的方法(Active Learning+Self-Supervision)
- 用Java语句判断一个数字是不是7的倍数
- Android Studio 3.0 正式版本 发行说明 (翻译)
- C语言中图形函数及其用法
- python学习笔记--虫师
- 主键和唯一性索引的区别
- 台式机和工作站到底有什么区别?
热门文章
- SandyMandy ,绝世好BABY http://angel.mingox.com
- 微软开源计算机视觉专题库,含分类、检测、分割、关键点、跟踪、动作识别等主流方向...
- 人脸年龄编辑:无可奈何花落去,似曾相似春又来!
- 干货!Kaggle座头鲸识别落下帷幕,冠军方案解读
- 2021年,作为算法工程师的你们会在CV业务上用Transformer吗?
- 计算机视觉论文-2021-06-11
- 谷歌、DeepMind提出高效Transformer评估基准
- 【TensorFlow系列一】TensorFlow工作原理
- 面向小姐姐的编程——java面相对象之抽象
- 推荐系统遇上深度学习(十七)--探秘阿里之MLR算法浅析及实现