您的位置:首页 > 其它

hdu-1372-Knight Moves(bfs和dfs)

2017-07-25 09:14 405 查看
题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1372

题意:骑士走日,和中国象棋中的马一样。在8*8的格子里。(下面假设 字母-‘a’+1为横坐标,数字为竖坐标)

BFS:

从起始点开始,每次对于满足题意的点,进行不满足题意的判断并且标记上该点的该次的计数(有时,可能为0或1,对于本题就是从起点走到次点的步数)。

我们可以想象出一步一层的结构。(第一步到达的点,为第一层的点。。。。。。依次推出)

为了完成这部分的操作,我们需要使用队列来完成,它每次的对于该层的判断,满足先进先出的原则。

(能理解就理解,不理解先看下面对第一个实例的讲解)

对于第一个实例: e2 e4(从黑块到红块)(如图8*8的表)

第一步:到达绿块
第二步:到达蓝块(只标重要位置的)
此时已经找到!!!!!!!

 abcdefgh
1  1   1 
2        
3  1   1 
4   1 21  
5        
6        
7        
8        
转换队列思想(伪代码):

int bfs(int x, int y)

{
先把(x,y)点压入队列

               while(!que.empty())
{
依次判断队头是否是目标点;

对于八个方向,进行筛选满足条件的压入队列,同时进行计入步数;

}

return  目标点的步数;

}

由伪代码可知
我们需要 
  :   队列一个,(压入队列的为两个值,so来个结构体)结构体一个,一个数组(为了表示八个方向),一个数组(来记录步数)

queue<int>  que;

   typedef struct node
{

    int x,y;
} point;

       nex[8][2]= {1,2,1,-2,2,1,2,-1,-1,2,-1,-2,-2,1,-2,-1};

sstep[10][10];

完整代码:

#include <iostream>
#include <stack>
#include <queue>
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

typedef struct node
{
int x,y;
} point;

int ax,bx,mmin;
char ay,by;
int nex[8][2]= {1,2,1,-2,2,1,2,-1,-1,2,-1,-2,-2,1,-2,-1};
int sstep[10][10];

queue<point> que;

int bfs(int xx, int yy)
{
point tt,bb;

tt.x=xx,tt.y=yy;

sstep[tt.x][tt.y]=0;

que.push(tt); //先把(x,y)点压入队列

while(!que.empty())
{
tt=que.front();

que.pop();

xx=tt.x,yy=tt.y;

if(xx==bx && yy==by)
{
break;  //依次判断队头是否是目标点
}
for(int i=0; i<8; i++)
{
bb.x=xx+nex[i][0];
bb.y=yy+nex[i][1];

if(bb.x<=0 || bb.y<=0 || bb.x>8 || bb.y>8)
continue;
if(sstep[bb.x][bb.y]!=-1)
continue;  //筛选满足条件的

sstep[bb.x][bb.y]=sstep[xx][yy]+1;

tt=bb;

que.push(tt);
}
}
return sstep[bx][by-'a'+1];
}

int main()
{
while(scanf("%c%d %c%d%*c",&ay,&ax,&by,&bx)!=EOF)
{
memset(sstep,-1,sizeof(sstep));
mmin=bfs(ax,ay-'a'+1);
printf("To get from %c%d to %c%d takes %d knight moves.\n",ay,ax,by,bx,mmin);
}
return 0;
}


到这里就结束了!!!

DFS些这道题不是不可以,但是其中剪枝不好找,而且这道题更符合BFS。

so

就附上一个博客吧!我的BFS启蒙博客!!(点击“启蒙博客”就OK啦!)

同时,在送上一道题,也是BFS的经典题目  !! (点击“经典题目”就OK啦!)

里面的讲解很棒,尤其是一开始对BFS原理的讲解,还有生动的图,希望大家加油吧!!!!!

       
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: