• Algorithm --> 棋盘中求出A到B的最小步数


    求出A到B的最小步数

    给定象棋盘,以及位置A和B, 求出从A到B的最小步数

    Input
    2             -->case 个数
    9 9          -->棋盘大小
    3 5 2 8    --> 起始位置
    20 20
    2 3 7 9

    Output
    2

    5

    代码:

    #include <cstdio>
    #include <iostream>
    #include <string.h>
    
    using namespace std;
    #define MAX 1000
    
    //八个方向
    int o[8][2] = { { 1, 2 }, { 1, -2 }, { -1, 2 }, { -1, -2 }, { -2, -1 }, { -2, 1 }, { 2, -1 }, { 2, 1 } };  
    
    int R, C;
    int _sX, _sY, _eX, _eY;  //起始坐标
    int graph[MAX][MAX];
    int Answer;
    
    void DFS( int sX, int sY, int cnt )
    {
        if( sX < 1 || sX > R || sY < 1 || sY > C )
        {
            return;
        }
    
        if( sX == _eX && sY == _eY )
        {
            if( Answer > cnt )     //求取最小步数 Answer 
            {
                Answer = cnt;
            }
        }
    
        if( graph[sX][sY] == 0 || graph[sX][sY] > cnt )  //当前格子没走或者值比cnt大,取较小值
        {
            graph[sX][sY] = cnt;
            for( int i = 0; i < 8; i++ )
            {
                DFS( sX + o[i][0], sY + o[i][1], cnt + 1 );
            }
        }
    }
    
    int main( int argc, char** argv )
    {
        int tc, T;
    
        freopen( "input_chess.txt", "r", stdin );
    
        cin >> T;
        for( tc = 0; tc < T; tc++ )
        {
            memset( graph, 0, sizeof( graph ) );
    
            cin >> R >> C;
            cin >> _sX >> _sY >> _eX >> _eY;
    
            graph[_sX][_sY] = 1;
    
            Answer = MAX;
    
            DFS( _sX, _sY, 0 );
    
            cout << Answer << endl;
        }
    
        return 0;
    }

    输入文件:

    5
    10 10
    1 1 10 10
    20 20
    2 3 7 9
    30 30
    2 15 29 29
    40 40
    2 3 1 40
    45 45
    40 10 27 40
  • 相关阅读:
    ListIterator
    List与set
    iterator取集合元素
    我眼中的AI
    集合的共性方法
    集合转数组
    打开与关闭eclipse的自动补全功能
    Mr_matcher的细节1
    nodelet的应用
    nodelet的理解
  • 原文地址:https://www.cnblogs.com/jeakeven/p/4788393.html
Copyright © 2020-2023  润新知