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();
	   }
	 }   
}  
       





posted @ 2017-02-08 14:40  X_na  阅读(115)  评论(0)    收藏  举报