hdu 1372 knight
题目链接:点击打开链接
题 意:
在象棋中马走日,求象棋马从一个点到另一个点走的最少的步数
搜索中的广度优先搜索,每一步都是最优,则整体最优。
代 码:
//在象棋中马走日,求象棋马从一个点到另一个点走的最少的步数
//搜索中的广度优先搜索,每一步都是最优,则整体最优。
#include<iostream>
#include<queue>
#include<string>
using namespace std;
string s1,s2;
struct node
{
int s,e,step;
}start,en;
int visited[100][100];//标记走过的
int dir[8][2]={2,1,2,-1,-2,1,-2,-1,1,2,1,-2,-1,2,-1,-2};
void bfs()
{
queue<node>q;
node temp,m;
visited[start.s][start.e]=1;//起点标记为1
start.step=0;//初始化步数为0
q.push(start);//起点进入队列
while(!q.empty())
{
temp=q.front();//取队尾元素
q.pop();
for(int i=0;i<8;i++)//向周围找
{
m.s=temp.s+dir[i][0];
m.e=temp.e+dir[i][1];
if(m.s==en.s&&m.e==en.e)//注意输出应为temp.step
{
cout<<"To get from "<<s1<<" to "<<s2<<" takes "<<temp.step+1<<" knight moves."<<endl;
return;//一定要是return 结束函数
}
if(m.s>=1&&m.s<=8&&m.e>=1&&m.e<=8&&visited[m.s][m.e]==0)//没有超过边界且没有访问过
{
visited[m.s][m.e]=1;//标记为访问过
m.step=temp.step+1;//更新步数
q.push(m);//进队列
}
}
}
}
int main()
{
while(cin>>s1>>s2)//转化为8*8的坐标
{
start.s=s1[0]-'a'+1;
start.e=s1[1]-'0';
en.s=s2[0]-'a'+1;
en.e=s2[1]-'0';
if(start.s==en.s&&start.e==en.e)//起点和终点一样
cout<<"To get from "<<s1<<" to "<<s1<<" takes 0 knight moves."<<endl;
else
{
for(int i=1;i<=8;i++)
for(int j=1;j<=8;j++)
visited[i][j]=0;//标记初始化状态都为0,走过的标记为1
bfs();
}
}
}

浙公网安备 33010602011771号