一开始写了个 BFS 然后就 T 了...

这道题是迭代加深搜索 + A*

------------------------------------------------------------------------------

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
 
#define rep( i , n ) for( int i = 0 ; i < n ; ++i )
#define clr( x , c ) memset( x , c , sizeof( x ) )
 
using namespace std;
 
const int N = 5;
const int goal[ N ][ N ] = { { 1 , 1 , 1 , 1 , 1 } ,
                             { 0 , 1 , 1 , 1 , 1 } , 
                             { 0 , 0 , 2 , 1 , 1 } ,
                             { 0 , 0 , 0 , 0 , 1 } , 
                             { 0 , 0 , 0 , 0 , 0 } };
const int dir[ 8 ][ 2 ] = { { 2 , -1 } , { 2 , 1 } , { -2 , -1 } , { -2 , 1 } ,
                            { -1 , 2 } , { 1 , 2 } , { -1 , -2 } , { 1 , -2 } };
 
#define check( x , y ) ( 0 <= x && x < N && 0 <= y && y < N )
 
int t[ N ][ N ] , ans;
bool flag;
 
bool f( int d ) {
rep( i , N )
   rep( j , N ) if( goal[ i ][ j ] != t[ i ][ j ] ) 
       if( ++d > ans ) return false;
return true;
}
 
void dfs( int x , int y , int d ) {
if( d == ans && !memcmp( t , goal , sizeof t ) ) {
   flag = true;
   return ;
}
if( flag ) return;
rep( i , 8 ) {
int dx = x + dir[ i ][ 0 ] , dy = y + dir[ i ][ 1 ];
if( ! check( dx , dy ) ) continue;
swap( t[ dx ][ dy ] , t[ x ][ y ] );
if( f( d ) ) dfs( dx , dy , d + 1 );
swap( t[ dx ][ dy ] , t[ x ][ y ] );
}
}
 
#define ok( x ) ( x == '0' || x == '1' || x == '*' )
 
int main() {
freopen( "test.in" , "r" , stdin );
int r;
scanf( "%d" , &r );
while( r-- ) {
int x , y;
rep( i , N ) 
rep( j , N ) {
char c = getchar();
while( ! ok( c ) ) c = getchar();
if( c == '*' )
   t[ x = i ][ y = j ] = 2;
else 
   t[ i ][ j ] = c - '0';
}
flag = false;
for( ans = 1 ; ans <= 15 ; ans++ ) {
dfs( x , y , 0 );
if( flag ) break;
}
printf( "%d\n" , flag ? ans : -1 );
}
return 0;
}

------------------------------------------------------------------------------

1085: [SCOI2005]骑士精神

Time Limit: 10 Sec  Memory Limit: 162 MB
Submit: 1109  Solved: 601
[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

HINT

Source

BZOJ 1085: [SCOI2005]骑士精神( IDDFS + A* )的更多相关文章

  1. Bzoj 1085: [SCOI2005]骑士精神 (dfs)

    Bzoj 1085: [SCOI2005]骑士精神 题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1085 dfs + 剪枝. 剪枝方法: ...

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

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

  3. [BZOJ 1085] [SCOI2005] 骑士精神 [ IDA* 搜索 ]

    题目链接 : BZOJ 1085 题目分析 : 本题中可能的状态会有 (2^24) * 25 种状态,需要使用优秀的搜索方式和一些优化技巧. 我使用的是 IDA* 搜索,从小到大枚举步数,每次 DFS ...

  4. bzoj 1085: [SCOI2005]骑士精神

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

  5. [BZOJ 1085][SCOI2005]骑士精神(IDA*)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1085 分析: 首先第一感觉是宽搜,但是空间需要8^15*5*5,明显不够,又鉴于最大深 ...

  6. BZOJ.1085.[SCOI2005]骑士精神(迭代加深搜索)

    题目链接 最小步数这类,适合用迭代加深搜索. 用空格走代替骑士. 搜索时记录上一步防止来回走. 不需要每次判断是否都在位置,可以计算出不在对应位置的骑士有多少个.而且每次复原一个骑士至少需要一步. 空 ...

  7. bzoj 1085 [SCOI2005]骑士精神——IDA*

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1085 迭代加深搜索. 估价函数是为了预计步数来剪枝,所以要优于实际步数. 没错,不是为了确定 ...

  8. bzoj 1085: [SCOI2005]骑士精神 IDA*

    题目链接 给一个图, 目标位置是确定的, 问你能否在15步之内达到目标位置. 因为只有15步, 所以直接ida* #include<bits/stdc++.h> using namespa ...

  9. BZOJ 1085: [SCOI2005]骑士精神(A*算法)

    第一次写A*算法(这就是A*?如果这就是A*的话,那不就只是搜索的一个优化了= =,不过h函数如果弄难一点真的有些难设计) 其实就是判断t+h(x)(t为当前步数,h(x)为达到当前状态的最小步数) ...

随机推荐

  1. Android 中文API (70) —— BluetoothDevice[蓝牙]

    前言 本章内容是  android.bluetooth.BluetoothDevice,为Android蓝牙部分的章节翻译.蓝牙设备类,代表了蓝牙通讯国足中的远端设备.版本为 Android  2.3 ...

  2. 浅谈CSS布局

    在No.4中谈及了下盒子模型,引出布局模型 1.布局模型有三类: 1)流动模型  flow(默认) 2)浮动模型  float 3)层模型  layer 2.文档流 :指的是文本沿着从左到右的方向展开 ...

  3. SqlBulkCopy的使用

    1.问题:导入大数据量到数据库,用我们普通的SqlHelper来做是每插入一条都是打开连接关闭连接,这样太慢,因此我们会想到让SqlConnection一直打开直到所有数据都插入完成再关闭连接.但是根 ...

  4. [转]SAP中找表的方法

    http://blog.chinaunix.net/uid-24063584-id-2642334.html 分类: 18种根据屏幕字段查找数据库表数据的技巧 帮助   18种根据屏幕字段查找潜在数据 ...

  5. [LeetCode]题解(python):018-4Sum

    题目来源: https://leetcode.com/problems/4sum/ 题意分析: 这道题目和3Sum的题目类似,找出所有的4个数,使得这4个数等于target. 题目思路: 这道题做法和 ...

  6. Apache和Nginx下禁止访问特定的目录或文件

    大家是否测试Apache做了目录禁止浏览后,目录下面的txt文件还是可以显示里面的内容的.例如:http://www.domain.com/test/此访问会报403错误,但是如果test下有很多tx ...

  7. 关于R.styleable的问题

    原来想直接想调用程序的东西,但是使用R.styleable的时候 eclipse不能解析了,后来发现原来被删除了此方法 public ImageAdapter(Context c) { mContex ...

  8. Android GPS应用:临近警告

    前面介绍过LocationManager有一个addProximityAlert(double latitude,double longitude,float radius,long expirati ...

  9. ThinkPHP - 模板引擎

    1.导入css/js文件 - CSS文件 <!--<link rel="stylesheet" type="text/css" href=" ...

  10. iOS Development: Proper Use of initWithNibName:bundle: Affects UITableViewController

    Address:http://www.outofcore.com/2011/07/ios-development-proper-use-of-initwithnibnamebundle-affects ...