[luoguP2324] [SCOI2005]骑士精神(A*?)
蒟蒻并不懂A*是什么,但是题解里有个Astar
可以看出,当前棋盘和最终的棋盘如果有k个不同的,那么至少需要k-1步来移动
所以如果 当前步数 + k - 1 > limit 就直接退出
然后当然就是用喜闻乐见的迭代加深搜索啦,广搜占空间那么大又难写
最后吐槽一句,为什么我加哈希判重反而比不判重慢。。?
#include <cstdio>
#define swap(x, y) ((x) ^= (y) ^= (x) ^= (y))
#define P 1000007 int 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;
}
[luoguP2324] [SCOI2005]骑士精神(A*?)的更多相关文章
- BZOJ1085: [SCOI2005]骑士精神 [迭代加深搜索 IDA*]
1085: [SCOI2005]骑士精神 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1800 Solved: 984[Submit][Statu ...
- 【bzoj1085】[SCOI2005]骑士精神
1085: [SCOI2005]骑士精神 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1757 Solved: 961[Submit][Statu ...
- BZOJ 1085: [SCOI2005]骑士精神( IDDFS + A* )
一开始写了个 BFS 然后就 T 了... 这道题是迭代加深搜索 + A* -------------------------------------------------------------- ...
- BZOJ_1085_[SCOI2005]骑士精神_IDDFS
BZOJ_1085_[SCOI2005]骑士精神_DFS Description 在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且有一个空位.在任何时候一个骑士都能按照骑 士的走法(它可 ...
- [luogu P2324] [SCOI2005]骑士精神
[luogu P2324] [SCOI2005]骑士精神 题目描述 输入输出格式 输入格式: 第一行有一个正整数T(T<=10),表示一共有N组数据.接下来有T个5×5的矩阵,0表示白色骑士,1 ...
- 【洛谷】2324:[SCOI2005]骑士精神【IDA*】
P2324 [SCOI2005]骑士精神 题目描述 输入输出格式 输入格式: 第一行有一个正整数T(T<=10),表示一共有N组数据.接下来有T个5×5的矩阵,0表示白色骑士,1表示黑色骑士,* ...
- BZOJ1085 SCOI2005 骑士精神【IDA* 启发式迭代加深】
BZOJ1085 SCOI2005 骑士精神 Description 在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且有一个空位.在任何时候一个骑士都能按照骑士的走法(它可以走到和它横坐 ...
- BZOJ 1085 [SCOI2005]骑士精神 【A*启发式搜索】
1085: [SCOI2005]骑士精神 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 2838 Solved: 1663 [Submit][St ...
- 洛谷 P2324 [SCOI2005]骑士精神 解题报告
P2324 [SCOI2005]骑士精神 题目描述 输入输出格式 输入格式: 第一行有一个正整数T(T<=10),表示一共有N组数据.接下来有T个5×5的矩阵,0表示白色骑士,1表示黑色骑士,* ...
随机推荐
- 【进度总结】第一个web应用程序(未完成)
web程序快速导航 使用Eclipse for Java EE Web Development,并配置Tomcat,这部分内容在众多教程中都描述的十分详细.我直接从代码部分开始记录流程: 这张图是We ...
- Javafinal变量
class Test02 { public static void main(String args[]){ final int x; x = 100; // ...
- X和面试随笔
第一次参加了面试,面试官很好,我写的笔试和回答的都很差劲,虽然技术方面的回答我想抽自己,但是人家还是要了,给了我一个机会,很感谢. 第一道题:设计一个进销存系统的表结构设计 1:老板每天要知道卖出的货 ...
- 朴素贝叶斯分类<转载>
转自http://www.cnblogs.com/leoo2sk/archive/2010/09/17/naive-bayesian-classifier.html 0.写在前面的话 我个人一直很喜欢 ...
- 三、绘图和可视化之matplotlib
#matplotlib简单绘图之plot import matplotlib.pyplot as plt a=[1,2,3] b=[10,2,30] plt.plot(a)#纵坐标为a的值,横坐标为a ...
- Java创建图片文件缩略图
public static void uploadImg(InputStream file, String filePath, String fileName, int widthdist, int ...
- Greenplum/Deepgreen(单机/伪分布)安装文档
Greenplum/Deepgreen数据库安装(单机/伪分布) 首先去官网下载centos7:https://www.centos.org/download/,选择其中一个镜像下载即可,网上随意下载 ...
- java面试宝典第四弹
动态代理 1. 什么是代理 我们大家都知道微商代理,简单地说就是代替厂家卖商品,厂家“委托”代理为其销售商品.关于微商代理,首先我们从他们那里买东西时通常不知道背后的厂家究竟是谁,也就是说,“委托者” ...
- 【数位dp】bzoj1799: [Ahoi2009]self 同类分布
各种奇怪姿势的数位dp Description 给出a,b,求出[a,b]中各位数字之和能整除原数的数的个数. Sample Input 10 19 Sample Output 3 HINT [约束条 ...
- 下载PhantomJS
PhantomJS新手?阅读并学习快速入门指南. 视窗 下载phantomjs-2.1.1-windows.zip(17.4 MB)并解压缩(解压缩)内容. 可执行文件phantomjs.exe已准备 ...