P2324 [SCOI2005]骑士精神

漂亮小姐姐单击就送:https://www.luogu.org/problemnew/show/P2324

题目描述

输入输出格式

输入格式:

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

输出格式:

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

输入输出样例

输入样例#1: 复制
2
10110
01*11
10111
01001
00000
01011
110*1
01110
01010
00100
输出样例#1: 复制
7
-1

说明

// luogu-judger-enable-o2
//先抄一遍吧
//实在是看不懂 

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;

const int N=20;

int T;
int map[N][N],x,y,maxdep,flag;
int cx[8]={-2,-2,-1,-1,1,1,2,2};
int cy[8]={-1,1,-2,2,-2,2,-1,1};
int goal[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,
};

inline bool check()
{
    for(int i=1;i<5;++i)
        for(int j=0;j<5;++j)
            if(map[i][j]!=goal[i][j])
                return false;
    return true;
}

inline int count()
{
    int cnt=0;
    for(int i=0;i<5;++i)
        for(int j=0;j<5;++j)
            if(map[i][j]!=goal[i][j])
                ++cnt;
    return cnt;
}

void dfs(int x,int y,int dep)
{
    if(dep==maxdep)
    {
        if(check())
        {
            flag=1;
            return;
        }
    }
    for(int i=0;i<8;++i)
    {
        int xx=x+cx[i],yy=y+cy[i];
        if(xx>=0&&xx<5&&yy>=0&&yy<5)
        {
            swap(map[xx][yy],map[x][y]);
            int tmp=count();
            if(dep+tmp<=maxdep)
                dfs(xx,yy,dep+1);
            swap(map[xx][yy],map[x][y]);
            if(flag)
                return;
        }
    }
}

char s[10];
int main()
{
    scanf("%d",&T);
    while(T--)
    {
        flag=0;
        for(int i=0;i<5;++i)
        {
            scanf("%s",s);
            for(int j=0;j<5;++j)
            {
                if(s[j]=='0')
                    map[i][j]=0;
                else if(s[j]=='1')
                    map[i][j]=1;
                else
                    map[i][j]=2,
                    x=i,y=j;
            }
        }
        if(check())
        {
            puts("0");
            continue;
        }
        for(maxdep=1;maxdep<=15;++maxdep)
        {
            dfs(x,y,0);
            if(flag)
                break;
        }
        if(flag)
            printf("%d
",maxdep);
        else
            puts("-1");
    }
    return 0;
}
原文地址:https://www.cnblogs.com/lovewhy/p/8717172.html