[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表示黑色骑士,* ...
随机推荐
- 洛谷 P1181 数列分段Section I(水题日常)
题目描述 对于给定的一个长度为N的正整数数列A[i],现要将其分成连续的若干段,并且每段和不超过M(可以等于M),问最少能将其分成多少段使得满足要求. 输入输出格式 输入格式: 输入文件divide_ ...
- TLint for 虎扑体育应用源码项目
虎扑非官方客户端TLint全新Material Design设计,简洁美观支持论坛全部操作,浏览帖子.点亮.回复.引用.收藏等多项个性化设置(不同主题,不同阅读模式) TLint For 虎扑体育 更 ...
- Chrome浏览器扩展程序的本地备份
由于众所周知的原因,有些朋友可能很难在线下载Chrome扩展程序.一种选择是可以让朋友把他成功安装的Chrome扩展程序导出成本地文件,然后让朋友发送给自己,在自己本地电脑上报这些本地文件直接拖到Ch ...
- canvas 在视频中的用法
<!doctype html> <html> <head> <meta charset="UTF-8"> <title> ...
- msys2 使用指定boost
pacman -S mingw-w64-x86_64-toolchain make mingw-w64-x86_64-cmake mingw-w64-x86_64-openssl mingw-w64- ...
- Java获取2个日期里面的所有月份
public static void main(String[] args) { String t1="2018-08-01"; t1 = t1.replaceAll(" ...
- chosen选择框加载数据
1.单选$(select).val($("#id").val());$(select).trigger("chosen:updated"); 2.多选 func ...
- metasploit-shellcode生成
0x00 安装metasploit $ curl https://raw.githubusercontent.com/rapid7/metasploit-omnibus/master/config/t ...
- ios 团购信息客户端demo(三)
接上二篇的内容,今天我们就来介绍一下如何将解析出来的数据放入AQGridView中显示出来,因为我们的工程中已经将AQGridView导入了,所以我们在KKFirstViewController中直接 ...
- 661. Image Smoother@python
Given a 2D integer matrix M representing the gray scale of an image, you need to design a smoother t ...