题目描述 Description

在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且有一个空位。在任何时候一个骑士都能按照骑士的走法(它可以走到和它横坐标相差为1,纵坐标相差为2或者横坐标相差为2,纵坐标相差为1的格子)移动到空位上。

给定一个初始的棋盘,怎样才能经过移动变成如下目标棋盘:

为了体现出骑士精神,他们必须以最少的步数完成任务。

输入描述 Input Description

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

输出描述 Output Description

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

样例输入 Sample Input
2
10110
01*11
10111
01001
00000
01011
110*1
01110
01010
00100
样例输出 Sample Output

7

-1

数据范围及提示 Data Size & Hint

见题面

/*
迭代加深搜索
加了两个剪枝,跑了47ms
①刚交换完的两个点不能立马交换回来
②如果当前有c个点与目标棋局不同,且已经走了t-1步,
如果c+t-2>limit ,则该方案不可行
*/
#include<cstdio>
#include<iostream>
#define M 6
using namespace std;
int goal[M][M]={{,,,,,},{,,,,,},{,,,,,},
{,,,,,},{,,,,,},{,,,,,}};
int aa[]={,,-,-,,,-,-};
int bb[]={,-,,-,,-,,-};
int a[M][M],map[M][M],num[M][M],ans;
int check()
{
int tot=;
for(int i=;i<=;i++)
for(int j=;j<=;j++)
if(a[i][j]!=goal[i][j])
tot++;
return tot;
}
void fuzhi()
{
for(int i=;i<=;i++)
for(int j=;j<=;j++)
a[i][j]=map[i][j];
}
void dfs(int sx,int sy,int x,int y,int t,int limit)
{
int c=check();
if(!c)
{
ans=min(ans,t-);
return;
}
if(t+c->limit)return;//①
if(t>limit)return;
for(int i=;i<;i++)
{
int xx=x+aa[i];
int yy=y+bb[i];
if(xx>=&&xx<=&&yy>=&&yy<=&&!(xx==sx&&yy==sy))//②
{
swap(a[x][y],a[xx][yy]);
dfs(x,y,xx,yy,t+,limit);
swap(a[x][y],a[xx][yy]);
}
}
}
void init()
{
int qx,qy;
ans=;
for(int i=;i<=;i++)
for(int j=;j<=;j++)
{
char c;
cin>>c;
if(c=='*')map[i][j]=,qx=i,qy=j;
else map[i][j]=c-'';
}
for(int k=;k<=;k++)
{
fuzhi();
dfs(qx,qy,qx,qy,,k);
if(ans<){printf("%d\n",ans);return;}
}
printf("-1\n");
}
int main()
{
int T;
scanf("%d",&T);
while(T--)init();
return ;
}

骑士精神 (codevs 2449)的更多相关文章

  1. Codevs 2449 骑士精神 2005年省队选拔赛四川

    2449 骑士精神 2005年省队选拔赛四川 时间限制: 1 s 空间限制: 128000 KB 题目等级 : **大师 Master** 题目描述 Description 在一个5×5的棋盘上有12 ...

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

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

  3. A*算法详解 BZOJ 1085骑士精神

    转载1:A*算法入门 http://www.cppblog.com/mythit/archive/2009/04/19/80492.aspx 在看下面这篇文章之前,先介绍几个理论知识,有助于理解A*算 ...

  4. 【BZOJ】1085: [SCOI2005]骑士精神(A*启发式搜索)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1085 囧啊囧,看了题解后写了个程序,但是样例总过不了T+T,调试了不下于1个小时,肉眼对拍看了根本看 ...

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

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

  6. 【BZOJ 1085】 [SCOI2005]骑士精神

    Description 在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且有一个空位.在任何时候一个骑士都能按照骑士的走法(它可以走到和它横坐标相差为1,纵坐标相差为2或者横坐标相差为2, ...

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

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

  8. [bzoj1805][SCOI2005]骑士精神 [启发式搜索]

    Description 在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且有一个空位.在任何时候一个骑士都能按照骑士的走法(它可以走到和它横坐标相差为1,纵坐标相差为2或者横坐标相差为2, ...

  9. 【日常学习】【IDA*】codevs2449 骑士精神题解

    题目描写叙述 Description 在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且有一个空位.在不论什么时候一个骑士都能依照骑士的走法(它能够走到和它横坐标相差为1.纵坐标相差为2或 ...

随机推荐

  1. WebForm中 页面传参的总结

    页面与后台的数据传递是实现动态页面的前提---数据交互.无论是MVC还是WebFrom 都需要详细了解各种前后台的数据传输方式,熟悉每种方式的优缺点,这样才能提高网站的性能,技术上得到锻炼. 1.Fo ...

  2. vs2013转为vs2010项目

    1.首先用记事本之类的工具打开.sln文件 打开后会看到如下信息 Format Version 12.00 就是指VS2013 VisualStudioVersion = 12.0.21005.1 指 ...

  3. viewport实现html页面动态缩放/meta viewport/viewport

    页面默认缩放比例为1,最小宽度为375px,在小于375px出现水平滚动条的时候重新计算显示比例缩小界面, <!DOCTYPE html> <html lang="en&q ...

  4. android studio 新建文件出错

  5. PL/SQL学习笔记(三)

    -----创建一个序列,再创建一个表(主键是数字),通过序列生成该表的主键值. create table mytb1( m_id number primary key, m_name ) not nu ...

  6. java5增加对https的支持

    jdk1.5不支持http协议,jdk1.8默认支持,比较好的解决方案是升级jdk,但是升级jdk风险极大.不能升级jdk的情况下,可以使用如下方式. 利用httpclient,进行封装,从而实现对h ...

  7. How `delete’ works ?

    这是2013年写的一篇旧文,放在gegahost.net上面 http://raison.gegahost.net/?p=21 February 16, 2013 How `delete’ works ...

  8. java nio 读取大文件

    package com.yao.bigfile; import java.io.File; import java.io.IOException; import java.io.RandomAcces ...

  9. UVA 11971 Polygon 多边形(连续概率)

    题意: 一根长度为n的木条,随机选k个位置将其切成k+1段,问这k+1段能组成k+1条边的多边形的概率? 思路: 数学题.要求的是概率,明显与n无关. 将木条围成一个圆后再开切k+1刀,得到k+1段. ...

  10. asp.net mvc 5 微信接入VB版 - 获取AccessToken

    获取AccessToken是微信接入的又一个基础操作.很多微信接口需要这个2小时一刷新的AccessToken作为参数. 转载请说明作者Nukepayload2 首先根据开发文档把获取AccessTo ...