您的位置:首页 > 其它

骑士的移动(Knight Moves, UVa 439)

2017-07-04 16:30 316 查看
本题实际上就是一次BFS,很普通,我这里利用对称性,将a-h视作行,1-8视作列,且a在上,h在下,1在左,7在右,这样符合C语言的数组习惯#include<iostream>
#include <queue>
#include <string>
using namespace std;
const int maxn = 8+5;
int dir[maxn][maxn]; //初始值设为0,表示还未访问,出发点的值设为1,以后没进一层,相应位置dir值加1,输出最后结果记得减1
queue<int> qx, qy;
int tox[] = {-2,-1,1,2,2,1,-1,-2};
int toy[] = {1,2,2,1,-1,-2,-2,-1};
void go(string s1, string s2)
{
int x1 = s1[0] - 'a', y1 = s1[1] - '1';
int x2 = s2[0] - 'a', y2 = s2[1] - '1';
qx.push(x1); qy.push(y1); dir[x1][y1] = 1;
while(!qx.empty()) //既然qx,qy同进同出,判断一个就好
{
int x = qx.front();qx.pop();
int y = qy.front();qy.pop();
if(x == x2 && y == y2) break;
for(int i = 0; i < 8; i++)
{
if (x + tox[i] >= 0 && x + tox[i] <= 7 && y + toy[i] >= 0 && y + toy[i] <= 7 && dir[x + tox[i]][y + toy[i]] == 0)
{
dir[ x + tox[i] ][ y + toy[i] ] = dir[x][y] + 1;
qx.push(x + tox[i]); qy.push(y + toy[i]);
}
}
}
cout<<"To get from " <<s1 << " to "<< s2<<" takes "<< dir[x2][y2] - 1<< " knight moves."<<endl;
}
int main()
{
string s1, s2;
while(cin>>s1>>s2)
{
//初始化
memset(dir, 0, sizeof(dir));
while (!qx.empty()) qx.pop();
while(!qy.empty())qy.pop();
go(s1, s2);
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: