您的位置:首页 > 其它

ZOJ Problem Set - 1091 Knight Moves

2010-02-23 15:49 405 查看
BFS+STL-queue教学级题目

#include<iostream>
#include<queue>
using namespace std;
struct point
{
int x;
int y;
int step;
}st,et;
int mp[10][10];
queue<point>mv;
void visit()
{
point pp;
if(mv.front().x+1<9&&mv.front().y-2>0&&mp[mv.front().x+1][mv.front().y-2]==0)
{
mp[mv.front().x+1][mv.front().y-2]=1;
pp.x=mv.front().x+1;
pp.y=mv.front().y-2;
pp.step=mv.front().step+1;
mv.push(pp);
}
if(mv.front().x+2<9&&mv.front().y-1>0&&mp[mv.front().x+2][mv.front().y-1]==0)
{
mp[mv.front().x+2][mv.front().y-1]=1;
pp.x=mv.front().x+2;
pp.y=mv.front().y-1;
pp.step=mv.front().step+1;
mv.push(pp);
}
if(mv.front().x+2<9&&mv.front().y+1<9&&mp[mv.front().x+2][mv.front().y+1]==0)
{
mp[mv.front().x+2][mv.front().y+1]=1;
pp.x=mv.front().x+2;
pp.y=mv.front().y+1;
pp.step=mv.front().step+1;
mv.push(pp);
}
if(mv.front().x+1<9&&mv.front().y+2<9&&mp[mv.front().x+1][mv.front().y+2]==0)
{
mp[mv.front().x+1][mv.front().y+2]=1;
pp.x=mv.front().x+1;
pp.y=mv.front().y+2;
pp.step=mv.front().step+1;
mv.push(pp);
}
if(mv.front().x-1>0&&mv.front().y+2<9&&mp[mv.front().x-1][mv.front().y+2]==0)
{
mp[mv.front().x-1][mv.front().y+2]=1;
pp.x=mv.front().x-1;
pp.y=mv.front().y+2;
pp.step=mv.front().step+1;
mv.push(pp);
}
if(mv.front().x-2>0&&mv.front().y+1<9&&mp[mv.front().x-2][mv.front().y+1]==0)
{
mp[mv.front().x-2][mv.front().y+1]=1;
pp.x=mv.front().x-2;
pp.y=mv.front().y+1;
pp.step=mv.front().step+1;
mv.push(pp);
}
if(mv.front().x-2>0&&mv.front().y-1>0&&mp[mv.front().x-2][mv.front().y-1]==0)
{
mp[mv.front().x-2][mv.front().y-1]=1;
pp.x=mv.front().x-2;
pp.y=mv.front().y-1;
pp.step=mv.front().step+1;
mv.push(pp);
}
if(mv.front().x-1>0&&mv.front().y-2>0&&mp[mv.front().x-1][mv.front().y-2]==0)
{
mp[mv.front().x-1][mv.front().y-2]=1;
pp.x=mv.front().x-1;
pp.y=mv.front().y-2;
pp.step=mv.front().step+1;
mv.push(pp);
}
}
int BFS()
{
st.step=0;
mv.push(st);
while(!mv.empty())
{
if(mv.front().x==et.x&&mv.front().y==et.y)return mv.front().step;
visit();
mv.pop();
}
}
int main()
{
char a,b;
int m;
char buf1[100],buf2[100];
while(scanf("%s %s",buf1,buf2)!=EOF)
{
sscanf(buf1,"%c%d",&a,&st.y);
sscanf(buf2,"%c%d",&b,&et.y);
st.x=a-'a'+1;
et.x=b-'a'+1;
memset(mp,0,sizeof(mp));
m=BFS();
printf("To get from %c%d to %c%d takes %d knight moves./n",a,st.y,b,et.y,m);
while(!mv.empty())
mv.pop();
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c