• [SCOI2005][BZOJ1085] 骑士精神


    1085: [SCOI2005]骑士精神

    Time Limit: 10 Sec  Memory Limit: 162 MB
    Submit: 1112  Solved: 604
    [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
     
    第一次写IDA*……算是通过这个题目初步了解了一下A*与迭代加深的思想吧,不过感觉这个题中所谓的IDA*不过是迭代加深加了个小剪枝罢了……也没有啥估价函数。
    #include<iostream>
    #include<cstdlib>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    int t,k,a[6][6];
    bool flag;
    char c;
    int ans[6][6]=
    {
        {0,0,0,0,0,0},
        {0,1,1,1,1,1},
        {0,0,1,1,1,1},
        {0,0,0,2,1,1},
        {0,0,0,0,0,1},
        {0,0,0,0,0,0}};
    int dx[8]={1,1,-1,-1,2,2,-2,-2};
    int dy[8]={2,-2,2,-2,1,-1,1,-1}; 
    int pd(int d,int k)
    {
        int v=0;
        for (int i=1;i<=5;i++)
            for (int j=1;j<=5;j++)
                if (a[i][j]!=ans[i][j]) 
                {
                    v++;
                    if (v+d>k) return 0;
                }
        return 1;
    }
    int judge()
    {
        for (int i=1;i<=5;i++)
            for (int j=1;j<=5;j++)
                if (a[i][j]!=ans[i][j]) return 0;
        return 1;
    }
    void Astar(int d,int x,int y)
    {
        int xx,yy;
        if (d==k) 
        {
            if (judge()) flag=1;
            return;
        }
        if (flag) return;
        for (int i=0;i<8;i++)
        {
            xx=x+dx[i];
            yy=y+dy[i];
            if (xx<1||xx>5||yy<1||yy>5) continue;
            swap(a[xx][yy],a[x][y]);
            if (pd(d,k)) Astar(d+1,xx,yy);
            swap(a[xx][yy],a[x][y]);
        }
    }
    int main()
    {
        scanf("%d",&t);
        while(t--)
        {
            int x,y;
            for (int i=1;i<=5;i++)
            {
                getchar();
                for (int j=1;j<=5;j++)
                {
                    c=getchar();
                    if (c=='*')
                    {
                        a[i][j]=2;
                        x=i;
                        y=j;
                        continue;
                    }
                    a[i][j]=c-'0';
                }
              }
            flag=0;
            for (k=1;k<=15;k++)
            {
                Astar(0,x,y);
                if (flag) 
                {
                    printf("%d
    ",k);
                    break;
                }
            }
            if (!flag) printf("-1
    ");
        }
        return 0;
    }
  • 相关阅读:
    poj 2488 DFS
    畅通工程 并查集模版
    KMP 模板
    poj 1426 DFS
    poj 2528 线段数
    poj 3468 线段数 修改区间(点)
    CVPR2012文章阅读(2)A Unified Approach to Salient Object Detection via Low Rank Matrix Recovery
    如何制定目标
    Saliency Map 最新综述
    计算机视觉模式识别重要会议杂志
  • 原文地址:https://www.cnblogs.com/ws-fqk/p/4638006.html
Copyright © 2020-2023  润新知