Knight Moves(UVA 439)

网址如下:

Knight Moves - UVA 439 - Virtual Judge (vjudge.net)

(第三方网站)

一道简单的bfs题

没啥好说的

没想到我一边听着经济学一边写代码

代码如下:

#include<cstdio>
#include<queue>
struct Loc{
    int c, r, step;
    Loc(int c, int r, int step):c(c), r(r), step(step){}
    bool operator==(const Loc &v) const{return (c == v.c && r == v.r);}
};
Loc st(0, 0, 0), dt(0, 0, 0);
char s1[3], s2[3];

void bfs(void)
{
    std::queue<Loc> q; q.push(st);
    while(!q.empty()){
        Loc u = q.front(); q.pop();
        if(u.c < 1 || u.c > 8 || u.r < 1 || u.r > 8) continue;
        if(u == dt){printf("To get from %s to %s takes %d knight moves.n", s1, s2, u.step); break;}
        q.push(Loc(u.c + 2, u.r + 1, u.step + 1)); q.push(Loc(u.c + 1, u.r + 2, u.step + 1));
        q.push(Loc(u.c + 2, u.r - 1, u.step + 1)); q.push(Loc(u.c + 1, u.r - 2, u.step + 1));
        q.push(Loc(u.c - 2, u.r + 1, u.step + 1)); q.push(Loc(u.c - 1, u.r + 2, u.step + 1));
        q.push(Loc(u.c - 2, u.r - 1, u.step + 1)); q.push(Loc(u.c - 1, u.r - 2, u.step + 1));
    }
}

int main(void)
{
    while(scanf("%s%s", s1, s2) == 2){
        st.c = s1[0] - 'a' + 1; st.r = s1[1] - '0'; st.step = 0;
        dt.c = s2[0] - 'a' + 1; dt.r = s2[1] - '0'; dt.step = 0;
        bfs();
    }
    return 0;
}

实际上这个代码中,对于骑士移动的那个的处理,可以写一个函数,使代码更加简洁,而且不容易写错

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>