• HDUOJ Knight Moves解题报告


    1.典型的bfs。

    2.难点在剪枝部分。有一个记录所走step的数组,记录到每个点所走的步数,如果一个点没走过,放进队列中,如果一个点走过,比较原来这个点的step值和由当前点计算的值,如果大,另其等于当前点的step值+1;

    3.这道题犯了超级低级的错误。。。写好了bfs()函数,结果在main()函数中没有添加bfs();语句,导致调试了好久得不到想要的结果。。。



    #include <stdio.h>
    #include <iostream>
    #include <queue>
    #include <cstring>
    
    using namespace std;
    
    struct Node
    {
        int x, y;
    } sta, end;
    
    char a, c;
    int b, d, i;
    int step[9][9];
    int che[8][2] = {{-1, +2}, {-2, +1}, {+1, +2}, {+2, +1}, {+2, -1}, {+1, -2}, {-1, -2}, {-2, -1}};
    
    bool check(int aa, int bb)
    {
        if( aa > 0 && aa <= 8 && bb > 0 && bb <= 8)
            return true;
        else return false;
    }
    
    void bfs()
    {
        queue <int> q;
        q.push(sta.x);
        q.push(sta.y);
        while(!q.empty())
        {
            int xx = q.front();
            q.pop();
            int yy = q.front();
            q.pop();
            if (xx == end.x && yy == end.y)
                continue;
            for(i = 0; i <8; i++)
            {
                if(!check(xx + che[i][0], yy + che[i][1]))
                    continue;
                if(!step[xx + che[i][0]][yy + che[i][1]] || step[xx + che[i][0]][yy + che[i][1]] > step[xx][yy] + 1)
                {
                    step[xx + che[i][0]][yy + che[i][1]] = step[xx][yy] + 1;
                    q.push(xx + che[i][0]);
                    q.push(yy + che[i][1]);
                }
            }
        }
    }
    
    
    int main()
    {
        while(scanf("%c", &a) != EOF)
        {
            memset(step, 0, sizeof(step));
            scanf("%d", &b);
            getchar();
            sta.x = a - 'a' + 1;
            sta.y = b;
            scanf("%c%d", &c, &d);
            getchar();
            end.x = c - 'a' + 1;
            end.y = d;
    
            bfs();
            cout << "To get from " << a << b <<" to " << c << d <<" takes " <<step[end.x][end.y]<<" knight moves."<< endl;
    
    
    //        cout << sta.x << ' ' << sta.y << ' ' << end.x << ' ' << end.y <<endl;
    
        }
        return 0;
    }
    


  • 相关阅读:
    spring boot 上传文件大小限制
    axios全局配置
    springboot 时间类型配置
    mybatis 全查 分页 模糊查询一体
    Vue响应式原理底层代码模拟实现
    浅谈vue响应式原理及发布订阅模式和观察者模式
    Vue Router的原理及history模式源码实现
    Vue路由之Hash模式和history模式的区别及History模式的解决办法
    webpack4.X之complier方法的实现及make前流程回顾
    webpack4.X之EntryOptionPlugin流程书写
  • 原文地址:https://www.cnblogs.com/dollarzhaole/p/3188964.html
Copyright © 2020-2023  润新知