题目:

1085: [SCOI2005]骑士精神

Time Limit: 10 Sec  Memory Limit: 162 MB
Submit: 1461  Solved: 796

[Submit][Status][Discuss]

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

解题心得:

1、在一看到这个问题的时候第一个想的就是八数码问题,但是很明显不是,这个题要比八数码问题简单太多了,它有一个很明显的限制就是它的布数不能超过十五部,给的时间也比较宽泛,就是一个dfs加剪枝就行了,连标记都不用,好像也没有办法可以标记。

2、剪枝有一点技巧,就是用现在的图和标准的图对比,有不同的地方就将cnt加一,如果cnt加上当前步骤大于15就可以直接跳出了(有多少个不同的地方就需要挪动多少布),准确的说是cnt-1。




#include<bits/stdc++.h>
using namespace std;
const int maxn = 6;
char maps[maxn][maxn];
char Maps[maxn][maxn];
int start_x,start_y;
int dir[8][2] = {1,2,1,-2,-1,2,-1,-2,2,1,2,-1,-2,1,-2,-1};//有八个方向不要弄错了
int Min = 0x7f7f7f7f;//记录最小的步骤
bool flag;//记录是否找到了小于等于15的步骤
bool check_1(int x,int y)//检查是否是黑色骑士,列数大于行数或列数等于行数但行数要小于2
{
if(y > x || (y == x && x < 2))
return true;
else
return false;
}
bool check(int x,int y)//检查是否走到了棋盘外面
{
if(x<0 || y<0 || x>=5 || y>=5)
return false;
else
return true;
} void pre_Maps()//建立用于比较的标准图
{
for(int i=0; i<5; i++)
for(int j=0; j<5; j++)
{
if(check_1(i,j))
Maps[i][j] = '1';
else
Maps[i][j] = '0';
}
Maps[2][2] = '*';
} void pre_maps()
{
for(int i=0; i<5; i++)
scanf("%s",maps[i]);
for(int i=0; i<5; i++)
for(int j=0; j<5; j++)
{
if(maps[i][j] == '*')
{
start_x = i;
start_y = j;
}
}
} void dfs(int x,int y,int step)
{
int c = 0;
int cnt = 0;
for(int i=0; i<5; i++)
{
for(int j=0; j<5; j++)
{
if(maps[i][j] != Maps[i][j])
c++;
if(check_1(i,j) && maps[i][j] == '1')
cnt++;
}
}
c-=1;
if(cnt == 12 && x == 2 && y == 2)
{
flag = true;
Min = step;
return;
}
if(c+step >= Min || c+step > 15)
return ;
for(int i=0; i<8; i++)
{
if(check(x+dir[i][0],y+dir[i][1]))
{
swap(maps[x][y],maps[x+dir[i][0]][y+dir[i][1]]);
dfs(x+dir[i][0],y+dir[i][1],step+1);
swap(maps[x+dir[i][0]][y+dir[i][1]],maps[x][y]);//在dfs回溯的时候一定要交换回去啊,之前搞忘了找了半天bug
}
}
}
int main()
{
int t;
scanf("%d",&t);
pre_Maps();
while(t--)
{
Min = 0x7f7f7f7f;
int cnt = 0;
flag = false;
pre_maps();
dfs(start_x,start_y,0);
if(!flag)
{
printf("-1\n");//没有找到
continue;
}
printf("%d\n",Min);
}
}

DFS:BZOJ1085-骑士精神的更多相关文章

  1. bzoj1085 骑士精神

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

  2. bzoj1085骑士精神(搜索)

    1085: [SCOI2005]骑士精神 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1893  Solved: 1051 Description ...

  3. BZOJ-1085:骑士精神 (迭代加深 + A*搜索)

    题意:给定一个5*5的棋盘,上面有白马给妈给12匹,以及一个空格.问是否能在15步内有给定棋盘转移到目标棋盘. 如果可以,输出最小步数. 否则输出-1: 思路:由于步数比较小,我们就直接不记录状态vi ...

  4. BZOJ-1085 骑士精神

    估价函数其实就是与目标状态有几个不同... 迭代启发搜索. #include <cstdlib> #include <cstdio> #include <cstring& ...

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

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

  6. [BZOJ1085] [SCOI2005] 骑士精神 (A*)

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

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

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

  8. BZOJ1085:[SCOI2005]骑士精神——题解+IDA*粗略讲解

    http://www.lydsy.com/JudgeOnline/problem.php?id=1085 Description 在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且有一个空 ...

  9. 【BZOJ1085】【SCOI2005】骑士精神 [A*搜索]

    骑士精神 Time Limit: 10 Sec  Memory Limit: 162 MB[Submit][Status][Discuss] Description 在一个5×5的棋盘上有12个白色的 ...

  10. 【bzoj1085】【 [SCOI2005]骑士精神】启发式剪枝+迭代加深搜索

    (上不了p站我要死了,侵权度娘背锅) 如果这就是启发式搜索的话,那启发式搜索也不是什么高级玩意嘛..(啪啪打脸) Description 在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且 ...

随机推荐

  1. matlab 基本操作

    导入excel 右键excel文件, import data, 选择column vector点击导入即可, 在右侧的workspace就可以看到添加的列变量了 在workspace中右键添加clas ...

  2. SpringBoot | 第二十四章:日志管理之AOP统一日志

    前言 上一章节,介绍了目前开发中常见的log4j2及logback日志框架的整合知识.在很多时候,我们在开发一个系统时,不管出于何种考虑,比如是审计要求,或者防抵赖,还是保留操作痕迹的角度,一般都会有 ...

  3. 引用 Session详解 作者:郎云鹏

    本文转载自leeldy<Session详解 作者:郎云鹏>   引用 leeldy 的 Session详解 作者:郎云鹏 目录: 一.术语session 二.HTTP协议与状态保持 三.理 ...

  4. MVC学习6 学习使用Code First Migrations功能 把Model的更新同步到DB中

     参考:http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/adding-a-new-field-to-th ...

  5. mysql服务器查询慢原因分析方法

    mysql数据库在查询的时候会出现查询结果很慢,超过1秒,项目中需要找出执行慢的sql进行优化,应该怎么找呢,mysql数据库提供了一个很好的方法,如下: mysql5.0以上的版本可以支持将执行比较 ...

  6. spring boot 基础 多环境配置

    对于多环境的配置,各种项目构建工具的思路基本上一致,都是通过配置多份不同环境的配置文件来区分. 1. 首先我们先创建不同环境下的属性文件,截图如下: application.properties  是 ...

  7. #include< >和#include“ ”的区别

    < >引用的是编译器的类库路径里面的头文件 " "引用的是你程序目录的相对路径中的头文件 假如你编译器定义的自带头文件引用在C:\Keil\c51\INC\下面 则#i ...

  8. [转]Linux中如何读写硬盘上指定物理扇区

    读指定物理扇区: dd  if=<源设备>  of=<输出设备或文件>   skip=<指定扇区值>  bs=512 count=1 写指定物理扇区: dd   i ...

  9. Spring,FetchType.LAZY和FetchType.EAGER什么区别?

    1.FetchType.LAZY:懒加载,加载一个实体时,定义懒加载的属性不会马上从数据库中加载. 2.FetchType.EAGER:急加载,加载一个实体时,定义急加载的属性会立即从数据库中加载. ...

  10. 浏览器 DNS缓存与DNS prefetch (DNS预解析)

    浏览器 DNS缓存 浏览器DNS缓存的时间跟DNS服务器返回的TTL值无关. 注:TTL(Time-To-Live),就是一条域名解析记录在DNS服务器中的存留时间. 浏览器在获取网站域名的实际IP地 ...