题意:棋盘上移动判断多少步可以到达(确认是可以到达的)
思路:BFS广度搜索,每一个点最多有8个可能的位置
然后依次“枚举”即可。
该版本为队列中存贮的为int 型的数据,每一组数据要压入队列3次,相应的出队列也是三次
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
//定义方向数组dir 为8个方向的偏移量
struct position
{
int x,y;
};
position dir[8]={
{-2,1},{-2,-1},{-1,-2},{1,-2},{2,-1},{2,1},{1,2},{-1,2}};
char c[6];
int a[6];
queue<int>que;
bool vis[9][9];
int ans;
bool in(int a,int b){
if(a>0&&a<=8&&b>0&&b<=8)
return true;
return false;
}
int BFS()
{
int col,row;//定义列,行,计数器
ans=0;
que.push(a[0]); //起点列
que.push(a[1]); //起点 行
que.push(ans); //起点步数
vis[a[1]][a[0]]=true;
while(!que.empty())
{
col=que.front(); que.pop();
row=que.front(); que.pop();
ans=que.front(); que.pop();//取编号
if(col==a[2]&&row==a[3]) //到达目标状态
return ans;
for(int i=0;i<8;i++) //向8个方向扩展
{
//扩展入队列
if(in(row+dir[i].x,col+dir[i].y)&&!vis[row+dir[i].x][col+dir[i].y]){
que.push(col+dir[i].y);
que.push(row+dir[i].x);
que.push(ans+1);
vis[row+dir[i].x][col+dir[i].y]=true;
}
}
}
}
int main()
{
int i,j;
while(gets(c))
{
while(!que.empty())
que.pop();
for(i=0;i<=8;i++)
for(j=0;j<=8;j++)
vis[i][j]=false;
a[0]=c[0]-'a'+1;
a[1]=c[1]-'0';
a[2]=c[3]-'a'+1;