15Knight Moves
2016-04-12 20:38
253 查看
简单题意
给出初始位置,目标位置,问骑士(国际象棋骑士)走到(国际象棋走法)终点,至少要几步
解题思路形成过程
典型广度优先搜索,和老师讲的例题差不多不过这个题有一列设置成了字母,可以用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;
}
给出初始位置,目标位置,问骑士(国际象棋骑士)走到(国际象棋走法)终点,至少要几步
解题思路形成过程
典型广度优先搜索,和老师讲的例题差不多不过这个题有一列设置成了字母,可以用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;
}
相关文章推荐
- 图的基本算法
- TOJ 1005
- 程序设计实习MOOC/第十四周编程作业/A:Flip Game(Northeastern Europe 2000)
- 程序设计实习MOOC/第十四周编程作业/B:迷宫问题
- 图的遍历(搜索)算法(深度优先算法DFS和广度优先算法BFS)
- Oil Deposits(深度或广度搜索)
- 广度优先搜索(BFS)+路径打印
- 图的设计与实现
- poj3984 迷宫问题
- 广度优先搜索
- 基础数据结构之队列
- POJ 2251 Dungeon Master (BFS例题)
- 为算法考试做准备--图的实现及广度和深度优先搜索实现
- 蓝桥杯 历届试题-九宫重排
- 图的邻接矩阵建立,广度深度搜索
- 图的邻接表(数组实现)建立,广度和深度搜索。。
- 广度优先搜索的实现
- 【数据结构与算法】自己动手实现图的BFS和DFS(附完整源码)
- 广度优先搜索bfs与抓住那头奶牛(Catch that cow, poj3278)
- HDU1242 Rescue