15Knight Moves
来源:互联网 发布:观音掐指准算法 编辑:程序博客网 时间:2024/06/05 07:12
简单题意
给出初始位置,目标位置,问骑士(国际象棋骑士)走到(国际象棋走法)终点,至少要几步
解题思路形成过程
典型广度优先搜索,和老师讲的例题差不多不过这个题有一列设置成了字母,可以用ASCLL码转换成int,不过我自己写了个map映照来转换,之后用BFS来求目标
AC代码
#include<iostream>
#include<map>
#include<queue>
#include<string.h>
#include<fstream>
using namespace std;
struct point{
int x,y,cnt;
};
point start,finish;
int sy,ey;
bool v[9][9];
int dir[8][2]={{-2,-1},{-2,1},{-1,2},{1,2},{2,1},{2,-1},{1,-2},{-1,-2}};
int bfs();
int main()
{
ifstream cin("in.txt");
freopen("in.txt","r",stdin);
map<char,int>m;
for(int i=0;i<8;i++)m['a'+i]=i+1;//把字母转换为数字;
char c1,c2;
int min;
while(cin>>c1>>sy){
start.x=m[c1];
start.y=sy;
getchar();
cin>>c2>>ey;
finish.x=m[c2];
finish.y=ey;
if(start.x==finish.x&&start.y==finish.y)
min=0;
else min=bfs();
printf("To get from %c%d to %c%d takes %d knight moves.\n",c1,sy,c2,ey,min);
}
return 0;
}
int bfs(){
memset(v,0,sizeof(v));
point pre,tmp;
start.cnt=0;
queue<point>q;
q.push(start);
v[start.x][start.y]=1;
while(!q.empty()){
pre=q.front();
q.pop();
if(pre.x==finish.x&&pre.y==finish.y)return pre.cnt;
for(int i=0;i<8;i++){
tmp.x=pre.x+dir[i][0];
tmp.y=pre.y+dir[i][1];
if(tmp.x<1||tmp.x>8||tmp.y<1||tmp.y>8)continue;
if(v[tmp.x][tmp.y]==1)continue;
v[tmp.x][tmp.y]=1;
tmp.cnt=pre.cnt+1;
q.push(tmp);
}
}
return -1;
}
- 15Knight Moves
- Knight Moves
- Knight Moves
- Knight Moves
- Knight Moves
- Knight Moves
- Knight Moves
- Knight Moves
- Knight Moves
- Knight Moves
- Knight Moves
- Knight Moves
- Knight Moves
- Knight Moves
- Knight Moves
- Knight Moves
- Knight Moves
- Knight Moves
- Android应用开发中如何进行单元测试
- Laxcus大数据管理系统2.0(5)- 第三章 数据存取
- android之fragment活动栈单例
- hdu1241
- c++实验2—学生成绩
- 15Knight Moves
- 三个线程轮流输出ABC各十次(另附两个数组找相同的数若干种解法+两个线程轮流循环若干次)
- 用Redis存储Tomcat集群的Session
- 友盟第三方分享入坑笔记(eclipse版)
- 百度地图定位,高德地图定位
- 在myeclipse中快速搭建Struts2框架
- 数据类型
- C++第三次作业
- Java集合(二):List列表