您的位置:首页 > 其它

BFS例题 ZOJ——1091 Knight Moves

2015-06-23 22:03 567 查看




例题:ZOJ——1091

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
#include<stdlib.h>
#include<iostream>
#include<queue>
#include<vector>
using namespace std;
#define maxn 1010
char aa[10],bb[10];
int fx[8][2]={1,2,2,1,2,-1,1,-2,-1,-2,-2,1,-2,-1,-1,2};
struct stu
{
int x,y,step;
};

int vis[10][10];
void bfs(int sx,int sy,int ex,int ey)
{
queue<stu>q; //定义结构体类型的队列
while(!q.empty()) q.pop(); //清空队列
vis[sx][sy]=1;

//处理起始点
stu cur; //定义结构体类型的变量,并赋初值
cur.x=sx,cur.y=sy,cur.step=0;
q.push(cur); //将cur压入队列

while(!q.empty())
{
cur=q.front(); //每次取队首元素并抛弃
q.pop();
if(cur.x==ex&&cur.y==ey) //如果满足条件则输出
{
printf("To get from %s to %s takes %d knight moves.\n",aa,bb,cur.step);
return;
}
for(int i=0;i<8;i++) //找到可以扩展的点,将其压入队列
{
int xx=cur.x+fx[i][0];
int yy=cur.y+fx[i][1];
if(xx>=0&&xx<8&&yy>=0&&yy<8&&!vis[xx][yy])
{
vis[xx][yy]=1;
stu temp;
temp.x=xx;
temp.y=yy;
temp.step=cur.step+1;
q.push(temp);
}
}
}
}

int main()
{
while(scanf("%s%s",aa,bb)!=EOF)
{
getchar();
//将a1,b2转换成(0,0),(1,1)
int sx=aa[0]-'a';
int sy=aa[1]-'0'-1;
int ex=bb[0]-'a';
int ey=bb[1]-'0'-1;
memset(vis,0,sizeof(vis));
bfs(sx,sy,ex,ey);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: