luoguP2324 [SCOI2005]骑士精神 IDA*
题面
这个题比较简单 直接枚举搜索深度
估价函数为当前棋盘与目标棋盘不同的棋的个数
然后直接迭代加深搜索就可以了
当然还不能走回头路
Codes
#include<bits/stdc++.h>using namespace std;const int N = 10;
char a[N][N], c[N][N];
int fx[8][2] = {{1, 2}, {1, -2}, {2, -1}, {2, 1}, {-2, -1}, {-2, 1}, {-1, 2}, {-1, -2}};
int n = 5, len;int diff() {int res = 0;for(int i = 1; i <= n; ++ i)for(int j = 1; j <= n; ++ j)res += (a[i][j] != c[i][j]);return res;
}bool dfs(int x, int y, int d, int last) {int res = diff();if(!res) return true;if(d == len) return false;if(d + res > 16) return false;for(int i = 0; i < 8; ++ i) {int xx = x + fx[i][0], yy = y + fx[i][1];if(xx < 0 || xx > n || yy < 0 || yy > n || i + last == 7) continue;swap(a[x][y], a[xx][yy]);if(dfs(xx, yy, d + 1, i)) return true;swap(a[x][y], a[xx][yy]);}return false;
}int main() {
#ifndef ONLINE_JUDGEfreopen("2324.in", "r", stdin);freopen("2324.out", "w", stdout);
#endifint T, flag = 0, sx, sy;c[1][1] = c[1][2] = c[1][3] = c[1][4] = c[1][5] = '1';c[2][1] = '0'; c[2][2] = c[2][3] = c[2][4] = c[2][5] = '1';c[3][1] = c[3][2] = '0'; c[3][3] = '*'; c[3][4] = c[3][5] = '1';c[4][1] = c[4][2] = c[4][3] = c[4][4] = '0'; c[4][5] = '1';c[5][1] = c[5][2] = c[5][3] = c[5][4] = c[5][5] = '0';for(scanf("%d", &T); T -- ; flag = 0) {for(int i = 1; i <= n; ++ i)scanf("%s", a[i] + 1);for(int i = 1; i <= n; ++ i) for(int j = 1; j <= n; ++ j)if(a[i][j] == '*')sx = i, sy = j;for(len = 0; len <= 15; ++ len) if(dfs(sx, sy, 0, -1)) {flag = 1; printf("%d\n", len); break;}if(!flag) puts("-1");}return 0;
}
luoguP2324 [SCOI2005]骑士精神 IDA*相关推荐
- [BZOJ 1085] [SCOI2005] 骑士精神 [ IDA* 搜索 ]
题目链接 : BZOJ 1085 题目分析 : 本题中可能的状态会有 (2^24) * 25 种状态,需要使用优秀的搜索方式和一些优化技巧. 我使用的是 IDA* 搜索,从小到大枚举步数,每次 DFS ...
- P2324 [SCOI2005]骑士精神(IDA*)
思路:不是动骑士,而是动空格.只能动15次,证明搜索树的高的确定的,考虑IDA解决 IDA能很好地解决一些搜索中有上界的情况 大概就是搞一个估值函数,然后当前情况+估价函数>限制的情况直接剪掉这 ...
- [luoguP2324] [SCOI2005]骑士精神(A*?)
传送门 蒟蒻并不懂A*是什么,但是题解里有个Astar 可以看出,当前棋盘和最终的棋盘如果有k个不同的,那么至少需要k-1步来移动 所以如果 当前步数 + k - 1 > limit 就直接退出 ...
- bzoj 1085: [SCOI2005]骑士精神(IDA*)
1085: [SCOI2005]骑士精神 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 2296 Solved: 1328 [Submit][St ...
- 洛谷 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 ...
- bzoj1085: [SCOI2005]骑士精神(a*)
1085: [SCOI2005]骑士精神 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 2555 Solved: 1472 [Submit][St ...
- 『骑士精神 IDA*』
骑士精神(SCOI2005) Description 在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且有一个空位.在任何时候一个骑士都能按照骑 士的走法(它可以走到和它横坐标相差为1,纵 ...
- 埃及分数The Rotation Game骑士精神——IDA*
IDA*:非常好用的搜索,可以解决很多深度浅,但是规模大的搜索问题. 估价函数设计思路:观察一步最多能向答案靠近多少. 埃及分数 题目大意: 给出一个分数,由分子a 和分母b 构成,现在要你分解成一系 ...
最新文章
- 数据结构和算法动态可视化
- 一文读懂word embedding
- 在python中、下列代码的输出是什么-python面试题详细总结(附答案)
- 失物招领php_新奥尔良圣徒队是否增加了失物招领?
- 【逆强化学习-2】最大熵学习(Maximum Entropy Learning)
- python内建函数是什么意思_python内建函数是什么意思
- java语言用数组接收字符_Java基础——数组应用之字符串String类
- 安装指定版本的GPU版本的tensorflow小技巧
- windows和android结合,Android和Windows 10可以很好地合作的10种方式
- 北京大学生物信息学(3)
- 拓端tecdat|R语言解决最优化运营研究问题-线性优化(LP)问题
- oracle判断字符串以什么开头_oracle存储过程 判断字符串开头
- 使用WebStorm开发web前端 网页中文乱码问题的解决方案
- WORD图标显示为白色解决办法
- java cad polyline,为AUTOCAD编写系列批量处理程序
- 2019半年总结——学习与成长
- MES主要功能模块介绍
- 程序员公众号用什么工具写?
- 使用百度地图API,定位并显示自己的位置
- Mybatisplus argument type mismatch