zoukankan      html  css  js  c++  java
  • codevs2449 骑士精神

    题目描述 Description

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

            给定一个初始的棋盘,怎样才能经过移动变成如下目标棋盘:

                             

    为了体现出骑士精神,他们必须以最少的步数完成任务。

    输入描述 Input Description

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

    输出描述 Output Description

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

    样例输入 Sample Input
    2
    10110
    01*11
    10111
    01001
    00000
    01011
    110*1
    01110
    01010
    00100
    样例输出 Sample Output

    7

    -1

    数据范围及提示 Data Size & Hint

    见题面

    思路:

    IDA*

    代码:

    #include<iostream>
    #include<cstdio>
    #include<string>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    #define mx 5
    using namespace std;
    struct Board{
        int board[mx][mx];
        int bx,by;
        
    };
    int ans[mx][mx] = {{1,1,1,1,1},
                       {2,1,1,1,1},
                       {2,2,0,1,1},
                       {2,2,2,2,1},
                       {2,2,2,2,2}};
    int dx[8] = {1,2,2,1,-1,-2,-2,-1};
    int dy[8] = {2,1,-1,-2,-2,-1,1,2};
    int d,id,bx,by;
    Board start;
    void input(){
        char tmp;
        for(int i = 0;i < 5;i++){
            for(int j = 0;j < 5;j++){
                cin>>tmp;
                if(tmp == '*'){
                    start.board[i][j] = 0;
                    by = i;
                    bx = j;
                }
                if(tmp == '1') start.board[i][j] = 1;
                if(tmp == '0') start.board[i][j] = 2;
            }
        }
    }
    int h(Board a){
        int ret = 0;
        for(int i = 0;i < 5;i++){
            for(int j = 0;j < 5;j++){
                ret += (ans[i][j] != a.board[i][j]);
            }
        }
        return ret;
    }
    bool idastar(int step,int maxdeep){
        if(step > maxdeep) return false;
        int g = h(start),bx,by;
        if(!g) return true;
        if(g + step - 1> maxdeep) return false;
        for(int i = 0;i < 5;i++){
            for(int j = 0;j < 5;j++){
                if(start.board[i][j] == 0){
                    bx = j;
                    by = i;
                }
            }
        }
        for(int i = 0;i < 8;i++){
            if(bx + dx[i] < 0 || bx + dx[i] >= mx || by + dy[i] < 0 || by + dy[i] >= mx) continue;
            swap(start.board[by + dy[i]][bx + dx[i]],start.board[by][bx]);
            if(idastar(step+1,maxdeep))return true;
            swap(start.board[by + dy[i]][bx + dx[i]],start.board[by][bx]);
        }
        return false;
    }
    int main(){
        int T;
        cin>>T;
        while(T--){
        input();
        for(id = 0;id <= 15;id++){
            if(idastar(0,id)){
                cout<<id<<endl;
                break;
            }
        }
        if(id > 15) cout<<-1<<endl;
    }
        return 0;
    }
  • 相关阅读:
    HDU1879 kruscal 继续畅通工程
    poj1094 拓扑 Sorting It All Out
    (转)搞ACM的你伤不起
    (转)女生应该找一个玩ACM的男生
    poj3259 bellman——ford Wormholes解绝负权问题
    poj2253 最短路 floyd Frogger
    Leetcode 42. Trapping Rain Water
    Leetcode 41. First Missing Positive
    Leetcode 4. Median of Two Sorted Arrays(二分)
    Codeforces:Good Bye 2018(题解)
  • 原文地址:https://www.cnblogs.com/hyfer/p/5812537.html
Copyright © 2011-2022 走看看