hdu-1372-Knight Moves(bfs和dfs)

题目传送门: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原理的讲解,还有生动的图,希望大家加油吧!!!!!

       





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值