BZOJ_1085_[SCOI2005]骑士精神_DFS

Description

  在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且有一个空位。在任何时候一个骑士都能按照骑
士的走法(它可以走到和它横坐标相差为1,纵坐标相差为2或者横坐标相差为2,纵坐标相差为1的格子)移动到空
位上。 给定一个初始的棋盘,怎样才能经过移动变成如下目标棋盘: 为了体现出骑士精神,他们必须以最少的步
数完成任务。

Input

  第一行有一个正整数T(T<=10),表示一共有N组数据。接下来有T个5×5的矩阵,0表示白色骑士,1表示黑色骑
士,*表示空位。两组数据之间没有空行。

Output

  对于每组数据都输出一行。如果能在15步以内(包括15步)到达目标状态,则输出步数,否则输出-1。

Sample Input

2
10110
01*11
10111
01001
00000
01011
110*1
01110
01010
00100

Sample Output

7
-1


因为题中说只需要考虑15步以内的,所以迭代加深搜索即可。

剪枝的话每次求一下还差几步没还原,然后和还剩几步可以走的比较。

代码:

#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define RR register
int tx[]={-2,-1,1,2,2,1,-1,-2};
int ty[]={-1,-2,-2,-1,1,2,2,1};
int g[6][6],a[6][6];
char s[10];
bool is() {
RR int i,j;
for(i=1;i<=5;i++) for(j=1;j<=5;j++) if(a[i][j]!=g[i][j]) return 0;
return 1;
}
int calc() {
RR int i,j,re=0;
for(i=1;i<=5;i++) {
for(j=1;j<=5;j++) re+=(a[i][j]!=g[i][j]);
}
return re;
}
bool dfs(int dep,int maxdep,int x,int y) {
if(dep==maxdep) {
if(is()) return 1;
return 0;
}
if(maxdep-dep<calc()-1) return 0;
RR int i;
for(i=0;i<8;i++) {
int dx=tx[i]+x,dy=ty[i]+y;
if(dx>=1&&dx<=5&&dy>=1&&dy<=5) {
swap(a[dx][dy],a[x][y]);
int tmp=calc();
if(tmp+dep<=maxdep) if(dfs(dep+1,maxdep,dx,dy)) return 1;
swap(a[dx][dy],a[x][y]);
}
}
return 0;
}
void solve() {
int i,j;
int sx=0,sy=0;
for(i=1;i<=5;i++) {
scanf("%s",s+1);
for(j=1;j<=5;j++) {
if(s[j]=='1') a[i][j]=1;
if(s[j]=='0') a[i][j]=0;
if(s[j]=='*') a[i][j]=2,sx=i,sy=j;
}
}
if(a==g) {
puts("0"); return ;
}
for(i=1;i<=15;i++) {
//printf("%d\n",i);
if(dfs(0,i,sx,sy)) {
printf("%d\n",i); return ;
}
}
puts("-1");
}
int main() {
int T;
int i;
scanf("%d",&T);
for(i=1;i<=5;i++) g[1][i]=1;
for(i=2;i<=5;i++) g[2][i]=1;
g[3][3]=2; g[3][4]=g[3][5]=g[4][5]=1;
while(T--) {
solve();
}
}

BZOJ_1085_[SCOI2005]骑士精神_IDDFS的更多相关文章

  1. BZOJ1085: [SCOI2005]骑士精神 [迭代加深搜索 IDA*]

    1085: [SCOI2005]骑士精神 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1800  Solved: 984[Submit][Statu ...

  2. 【bzoj1085】[SCOI2005]骑士精神

    1085: [SCOI2005]骑士精神 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1757  Solved: 961[Submit][Statu ...

  3. BZOJ 1085: [SCOI2005]骑士精神( IDDFS + A* )

    一开始写了个 BFS 然后就 T 了... 这道题是迭代加深搜索 + A* -------------------------------------------------------------- ...

  4. [luogu P2324] [SCOI2005]骑士精神

    [luogu P2324] [SCOI2005]骑士精神 题目描述 输入输出格式 输入格式: 第一行有一个正整数T(T<=10),表示一共有N组数据.接下来有T个5×5的矩阵,0表示白色骑士,1 ...

  5. 【洛谷】2324:[SCOI2005]骑士精神【IDA*】

    P2324 [SCOI2005]骑士精神 题目描述 输入输出格式 输入格式: 第一行有一个正整数T(T<=10),表示一共有N组数据.接下来有T个5×5的矩阵,0表示白色骑士,1表示黑色骑士,* ...

  6. BZOJ1085 SCOI2005 骑士精神【IDA* 启发式迭代加深】

    BZOJ1085 SCOI2005 骑士精神 Description 在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且有一个空位.在任何时候一个骑士都能按照骑士的走法(它可以走到和它横坐 ...

  7. BZOJ 1085 [SCOI2005]骑士精神 【A*启发式搜索】

    1085: [SCOI2005]骑士精神 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 2838  Solved: 1663 [Submit][St ...

  8. 洛谷 P2324 [SCOI2005]骑士精神 解题报告

    P2324 [SCOI2005]骑士精神 题目描述 输入输出格式 输入格式: 第一行有一个正整数T(T<=10),表示一共有N组数据.接下来有T个5×5的矩阵,0表示白色骑士,1表示黑色骑士,* ...

  9. 【洛谷2324】[SCOI2005]骑士精神 IDA*

    [SCOI2005]骑士精神 描述 在一个\(5×5\)的棋盘上有\(12\)个白色的骑士和\(12\)个黑色的骑士, 且有一个空位.在任何时候一个骑士都能按照骑 士的走法(它可以走到和它横坐标相差为 ...

随机推荐

  1. 《深入理解java虚拟机》读书笔记1--java内存区域

    Java内存管理 本文主要介绍Java虚拟机运行时的内存区域是如何划分的.Java对象的创建过程.Java对象的内存布局.Java对象的访问定位 一:运行时区域划分 主要可以分为以下 几个: 程序计数 ...

  2. Spring对事务管理的支持的发展历程(基础篇)

    1.问题 Connection conn = DataSourceUtils.getConnection(); //开启事务 conn.setAutoCommit(false); try { Obje ...

  3. Map 遍历分析

    1. 阐述 对于Java中Map的遍历方式,很多文章都推荐使用entrySet,认为其比keySet的效率高很多.理由是:entrySet方法一次拿到所有key和value的集合:而keySet拿到的 ...

  4. 关于MVC的特性(AuthorizeAttribute)的一些理解

    许多 Web 应用程序要求在用户登录之后才授予其对受限制内容的访问权限. 在某些应用程序中,即使是登录的用户,也会限制他们可以查看的内容或可以编辑的字段. 要限制对 ASP.NET MVC 视图的访问 ...

  5. window.open open new window?

    when ever i use window.location.href=//some url it always open a new window, this only happens when ...

  6. win7 64位专业版下的x64编译问题

    在Django的开发过程中,碰到一个问题,就是所有本地库的位数必须是相同的,于是某些库需要重新编译一下,工作环境,不能用盗版程序,VC++ 2008\2010 Express版本身都不支持X64的编译 ...

  7. Jmeter(二十七)_Beanshell保存响应内容到本地

    利用Jmeter-BeanShell PostProcessor可以提取响应结果并保存到本地文件,这种操作在jmeter做爬虫时非常有用,可以帮助你迅速的获取想要的内容到本地文件! 1:在本地新建一个 ...

  8. Python2和Python3的差异

    之前做Spark大数据分析的时候,考虑要做Python的版本升级,对于Python2和Python3的差异做了一个调研,主要对于语法和第三方工具包支持程度进行了比较. 基本语法差异 核心类差异 Pyt ...

  9. 在Web中获取MAC地址

    很多时候都很难琢磨客户在想什么,也许是自己业务经验不足,也许是客户要显示出他在软件方面也非常的专业.记得以前听过一个故事,说一个富人想娶个媳妇,然后他比较钟意的有三个女人,然后就想从三个女人中选一个, ...

  10. QUIC协议的分析,性能测试以及在QQ会员实践

    WeTest 导读 你听过HTTPS.HTTP2.0.SPDY,但是这些应用层协议都是基于可靠的传输层协议TCP来实现的.那么,基于高效的UDP协议有没有一种相对可靠的应用层协议呢? Why QUIC ...