hdu 1372 knight

来源:互联网 发布:上海美团数据分析 编辑:程序博客网 时间:2024/06/03 22:39

题目链接:点击打开链接

题       意:

                 在象棋中马走日,求象棋马从一个点到另一个点走的最少的步数   

                  搜索中的广度优先搜索,每一步都是最优,则整体最优。

代      码:

//在象棋中马走日,求象棋马从一个点到另一个点走的最少的步数 //搜索中的广度优先搜索,每一步都是最优,则整体最优。 #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();   } }   }         





1 0
原创粉丝点击