zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    Linux 忘记root密码
    Linux 基础命令
    Linux 运行级别
    Oracle 体系结构
    Oracle 数据库启动过程
    数据库设计范式
    Oracle通过ROWID删除表中重复记录
    JACASCRIPT--的奇技技巧的44招
    css 的小细节,小总结
    关于我们DOM的知识点
  • 原文地址:https://www.cnblogs.com/lovewhy/p/8717172.html
Copyright © 2011-2022 走看看