网址如下:
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;
}
实际上这个代码中,对于骑士移动的那个的处理,可以写一个函数,使代码更加简洁,而且不容易写错