您的位置:首页 > 其它

uva439 -- Knight Moves

2017-04-15 23:34 387 查看
题目链接

这题是经典的BFS题目,没有什么坑,棋盘是固定的8*8,由于输入时不知道会有多少组数据,所以采用getline(cin,string)+stringstream来输入,然后将字符串表示的位置转换为数字表示的坐标后BFS即可,AC代码如下:

#include <iostream>
#include <sstream>
#include <cstring>
#include <cstdio>
#include <string>
#include <vector>
#include <queue>
using namespace std;

struct Node
{
int r;
int c;
int steps;

Node(int r,int c,int s):r(r),c(c),steps(s){}
};
queue<Node> q;

int sr,sc,er,ec;    //开始位置(sr,sc),目标位置(er,ec)
int visit[10][10];
int dir[8][2]={{-2,1},{-1,2},{1,2},{2,1},{2,-1},{1,-2},{-1,-2},{-2,-1}};
char start[3];
char dest[3];

bool isInside(int r, int c) //是否越界
{
if(r>=0&&r<8&&c>=0&&c<8)
return true;
return false;
}

void bfs()
{
while(!q.empty())
{
Node node=q.front();
q.pop();
if(node.r==er&&node.c==ec)
{
printf("To get from %s to %s takes %d knight moves.\n",start,dest,node.steps);
return;
}
for(int i=0;i<8;i++)
{
int nextr=node.r+dir[i][0]; //下一步的坐标
int nextc=node.c+dir[i][1];
if(isInside(nextr,nextc)&&!visit[nextr][nextc])
{
q.push(Node(nextr,nextc,node.steps+1));
visit[nextr][nextc]=1;
}
}
}
}

int main()
{
//freopen("test.txt","r",stdin);
string line;
while(getline(cin,line))
{
while(!q.empty()) q.pop();
memset(visit,0,sizeof(visit));
stringstream ss(line);
ss>>start>>dest;
sr=start[1]-'1';    //将字符串表示的坐标转换为数字表示的坐标
sc=start[0]-'a';
er=dest[1]-'1';
ec=dest[0]-'a';
q.push(Node(sr,sc,0));
bfs();
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  bfs uva