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
- HDU 1372 knight moves
- HDU 1372 Knight Moves
- HDU-1372-Knight Moves
- hdu 1372 Knight Moves
- HDU 1372 Knight Moves
- hdu 1372 Knight Moves
- Hdu 1372 Knight Moves
- HDU 1372 Knight Moves
- HDU 1372 Knight Moves
- HDU-1372Knight Moves
- HDU-1372-Knight Moves
- hdu 1372 Knight Moves
- hdu-1372-Knight Moves
- HDU 1372 Knight Moves
- HDU-1372-knight moves
- hdu(1372) Knight Moves
- hdu 1372 Knight Moves
- hdu 1372 Knight Moves
- 经纬度坐标转换
- Spring()----IOC
- Spark经典案例6-求top值
- spring学习(三)—深入理解DIP、IoC、DI以及IoC容器
- mysql 主从同步配置
- hdu 1372 knight
- Spring之旅--Spring 实例化bean的三种方式
- @Value初使用小记
- Android RectF()用法
- redis常见命令
- 四.hmtl报告之内容提取和报告最为附件发送到你邮箱
- ubuntu 提示boot空间不足的问题解决方案
- 安卓手机 点击 a 标签出现手机输入法的解决办法
- Linux 远程工具(命令行、FTP、桌面)