[bzoj] 1085 骑士精神 || ID-DFS
原题
找到最少的步数成为目标状态。
IDDFS(限制层数的dfs)即可
#include<cstdio>
#include<algorithm>
using namespace std;
int t,n,m,disx[10]={0,1,2,2,1,-1,-2,-2,-1},disy[10]={0,2,1,-1 ,-2,-2,-1,1,2},posx,posy,ans;
char a[8][8];
int read()
{
int ans=0,fu=1;
char j=getchar();
for (;(j<'0' || j>'9') && j!='-';j=getchar()) ;
if (j=='-') j=getchar(),fu=-1;
for (;j>='0' && j<='9';j=getchar()) ans*=10,ans+=j-'0';
return ans*fu;
}
int chk()
{
int cnt;
if (a[3][3]!='*') cnt=1;
for (int i=1;i<=5;i++)
for (int j=i+(i>=3);j<=5;j++)
if (a[i][j]=='0') cnt++;
for (int i=5;i>=1;i--)
for (int j=1;j<=i-(i<=3);j++)
if (a[i][j]=='1') cnt++;
return cnt;
}
bool check()
{
for (int i=1;i<=5;i++)
for (int j=i+(i>=3);j<=5;j++)
if (a[i][j]=='0') return 0;
for (int i=5;i>=1;i--)
for (int j=1;j<=i-(i<=3);j++)
if (a[i][j]=='1') return 0;
return 1;
}
bool illegal(int x,int y)
{
if (x<1 || y<1) return 1;
if (x>5 || y>5) return 1;
return 0;
}
void dfs(int x,int px,int py)
{
if (!x)
{
if (px==3 && py==3 && check()) ans=1;
return ;
}
for (int i=1;i<=8;i++)
{
int vx,vy;
vx=px+disx[i];
vy=py+disy[i];
if (illegal(vx,vy)) continue;
swap(a[vx][vy],a[px][py]);
if (chk()<=x) dfs(x-1,vx,vy);
swap(a[vx][vy],a[px][py]);
}
}
int main()
{
t=read();
while (t--)
{
ans=0;
for (int i=1;i<=5;i++)
{
for (int j=1;j<=5;j++)
{
a[i][j]=getchar();
if (a[i][j]=='*') posx=i,posy=j;
}
getchar();
}
for (int i=0;i<=15;i++)
{
dfs(i,posx,posy);
if (ans)
{
printf("%d\n",i);
break;
}
}
if (!ans) printf("-1\n");
}
return 0;
}
[bzoj] 1085 骑士精神 || ID-DFS的更多相关文章
- bzoj 1085骑士精神
bzoj 1085骑士精神 在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士,且有一个空位.在任何时候一个骑士都能按照骑士的走法(它可以走到和它横坐标相差为1,纵坐标相差为2或者横坐标相差为2 ...
- BZOJ 1085 骑士精神 迭代加深搜索+A*
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1085 题目大意: 在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且有一个 ...
- A*算法详解 BZOJ 1085骑士精神
转载1:A*算法入门 http://www.cppblog.com/mythit/archive/2009/04/19/80492.aspx 在看下面这篇文章之前,先介绍几个理论知识,有助于理解A*算 ...
- bzoj 1085骑士精神 迭代深搜
题目传送门 题目大意:给出一幅棋盘,问能否复原,中文题面,不做解释. 思路:第一次写迭代深搜的题目,这道题还是挺经典的.这道题的状态很明显的每多搜一层就是多八倍,非常的多,而且又是t组输入,所以必定有 ...
- [BZOJ]1085 骑士精神(SCOI2005)
这种鲜明的玄学风格很明显就是十几年前的题目. Description 在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且有一个空位.在任何时候一个骑士都能按照骑士的走法(它可以走到和它横坐 ...
- BZOJ SCOI2005骑士精神
裸IDA*,ans从1到15循环来限制搜索深度. #include<cstdio> #include<cstring> #include<algorithm> us ...
- Bzoj 1085: [SCOI2005]骑士精神 (dfs)
Bzoj 1085: [SCOI2005]骑士精神 题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1085 dfs + 剪枝. 剪枝方法: ...
- 【BZOJ】1085: [SCOI2005]骑士精神(A*启发式搜索)
http://www.lydsy.com/JudgeOnline/problem.php?id=1085 囧啊囧,看了题解后写了个程序,但是样例总过不了T+T,调试了不下于1个小时,肉眼对拍看了根本看 ...
- [BZOJ 1085] [SCOI2005] 骑士精神 [ IDA* 搜索 ]
题目链接 : BZOJ 1085 题目分析 : 本题中可能的状态会有 (2^24) * 25 种状态,需要使用优秀的搜索方式和一些优化技巧. 我使用的是 IDA* 搜索,从小到大枚举步数,每次 DFS ...
随机推荐
- [优化]Steamroller-freecodecamp算法题目
晚上在medium看到一篇关于找工作的文章,里面提到一个面试题目--flattening an array(扁平化数组).这我好像在哪看过!应该是freecodecamp里的算法某一题.翻了下博客记录 ...
- UVa中国麻将(Chinese Mahjong,Uva 11210)
简单的回溯题 #include<iostream> #include<cstdio> #include<cstring> #include<algorithm ...
- Ansible学习 ad-hoc命令
Ansible提供两种方式去执行命令,一种是ad-hoc命令,一种是写入Ansible playbook.类似于前者在命令行敲shell,后者是写shell-script脚本,前者解决一些简单的任务, ...
- PHP 二维数组按某一个键值排序
一.前言 在某个项目中,需要读取某个文件夹下的所有文件,在本地的 Windows 环境下时,读取出来的二维数组的文件名称和在 Windows 文件夹的文件排序一致, 但是项目上线后,环境为 Linux ...
- 如何查询进程中占用CPU的线程
top -c 命令查找进程PID top -Hp PID 找进程中的线程号 echo %x 线程号 将线程转换成16进制 jstack PID |grep ...
- 区间DP入门题目合集
区间DP主要思想是先在小区间取得最优解,然后小区间合并时更新大区间的最优解. 基本代码: //mst(dp,0) 初始化DP数组 ;i<=n;i++) { dp[i][i]=初始 ...
- POJ:3279-Fliptile(矩阵反转)
Fliptile Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 14701 Accepted: 5381 Description ...
- TouTiao开源项目 分析笔记13 最后一个订阅号的实现主页面
1.实现订阅号的基础类 1.1.本地订阅号的Bean类==>MediaChannelBean public class MediaChannelBean implements Parcelabl ...
- 使用java去对比2个带数学公式的字符串
首先大家看到这个题目,可能会不屑一顾,呵呵,是的,起初我也认为这是个很简单的任务,当任务拿到手里后,经过我作为程序员来讲已经磨炼的无比通透的大脑来讲发现这其实是个坑. 故事的起因是这样的,想开发一款给 ...
- win 7 查看端口被占用
开始---->运行---->cmd,或者是window+R组合键,调出命令窗口 输入命令:netstat -ano,列出所有端口的情况.在列表中我们观察被占用的端口,比如是4915 ...