一.题目链接:

HYSBZ-1085

二.题目大意:

直接看题目,懒得解释.

三.分析:

其实就是一个简单 A* 搜索 的板子

为了方便,分析就写注释里了.

四.代码实现:

#include <set>
#include <map>
#include <ctime>
#include <queue>
#include <cmath>
#include <stack>
#include <vector>
#include <cstdio>
#include <sstream>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#define eps 1e-4
#define PI acos(-1.0)
#define ll long long int
using namespace std;

int ans;
int mp[10][10];
int s[5][5] = {
    {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},
};///在这里存目标地图
int Move[8][2] = {
    {1, 2}, {1, -2}, {-1, 2}, {-1, -2},
    {2, 1}, {2, -1}, {-2, 1}, {-2, -1}
};/// 8 个方向

int check()///计算从 现地图 转化到 目标地图 所需的最佳代价 
{
    int cnt = 0;
    for(int i = 0; i < 5; ++i)
    {
        for(int j = 0; j < 5; ++j)
        {
            if(mp[i][j] != s[i][j])
                cnt++;
        }
    }
    return cnt;
}

void A_star(int y, int x, int g, int now)///类似于 dfs
{
    if(g == now)
    {
        if(check() == 0)/// 现地图 与 目标地图 相同
            ans = now;
        return;
    }
    if(~ans)/// ans != -1.
        return;
    for(int i = 0; i < 8; ++i)
    {
        int ny = y + Move[i][0];
        int nx = x + Move[i][1];
        if(ny < 0 || ny > 4 || nx < 0 || nx > 4)
            continue;
        swap(mp[y][x], mp[ny][nx]);
        if(check() + g <= now)
            A_star(ny, nx, g + 1, now);
        swap(mp[y][x], mp[ny][nx]);
    }
}

int main()
{
    int T;
    scanf("%d", &T);
    while(T--)
    {
        char ch;
        int y;
        int x;
        for(int i = 0; i < 5; ++i)
        {
            getchar();
            for(int j = 0; j < 5; ++j)
            {
                scanf("%c", &ch);
                if(ch == '*')
                {
                    y = i;
                    x = j;
                    mp[i][j] = 2;
                }
                else
                    mp[i][j] = ch - '0';
            }
        }
        ans = -1;
        for(int i = 0; i < 16; ++i)///枚举所需步数
        {
            A_star(y, x, 0, i);
            if(~ans)
                break;
        }
        printf("%d\n", ans);
    }
    return 0;
}