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的表)
第一步:到达绿块
第二步:到达蓝块(只标重要位置的)
此时已经找到!!!!!!!
转换队列思想(伪代码):
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];
完整代码:
到这里就结束了!!!
DFS些这道题不是不可以,但是其中剪枝不好找,而且这道题更符合BFS。
so
就附上一个博客吧!我的BFS启蒙博客!!(点击“启蒙博客”就OK啦!)
同时,在送上一道题,也是BFS的经典题目 !! (点击“经典题目”就OK啦!)
里面的讲解很棒,尤其是一开始对BFS原理的讲解,还有生动的图,希望大家加油吧!!!!!
题意:骑士走日,和中国象棋中的马一样。在8*8的格子里。(下面假设 字母-‘a’+1为横坐标,数字为竖坐标)
BFS:
从起始点开始,每次对于满足题意的点,进行不满足题意的判断并且标记上该点的该次的计数(有时,可能为0或1,对于本题就是从起点走到次点的步数)。
我们可以想象出一步一层的结构。(第一步到达的点,为第一层的点。。。。。。依次推出)
为了完成这部分的操作,我们需要使用队列来完成,它每次的对于该层的判断,满足先进先出的原则。
(能理解就理解,不理解先看下面对第一个实例的讲解)
对于第一个实例: e2 e4(从黑块到红块)(如图8*8的表)
第一步:到达绿块
第二步:到达蓝块(只标重要位置的)
此时已经找到!!!!!!!
a | b | c | d | e | f | g | h | |
1 | 1 | 1 | ||||||
2 | ||||||||
3 | 1 | 1 | ||||||
4 | 1 | 2 | 1 | |||||
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原理的讲解,还有生动的图,希望大家加油吧!!!!!
相关文章推荐
- HDU 1372 Knight Moves (搜索 使用 dfs bfs两种实现)
- hdu 1372 Knight Moves bfs搜索 解题报告
- HDU 1372 广度优先搜索(BFS) Knight Moves
- POJ 2243 || HDU 1372:Knight Moves(BFS)
- HDU 1372 Knight Moves(BFS)
- HDU 1372--Knight Moves【BFS】
- ZOJ 1091 (HDU 1372) Knight Moves(BFS)
- hdu 1372&&uva 439 KnightMoves(bfs)
- hdu 1372 Knight Moves(BFS)
- HDU 1372 Knight Moves(BFS)
- UVa 439/HDU 1372/POJ 2243/ZOJ 1091 Knight Moves(BFS&纯数学方法)
- hdu1372 Knight Moves BFS 搜索
- HDU 1372 Knight Moves 广度优先搜索 bfs
- hdu1372 Knight Moves(BFS)
- HDU-#1372 Knight Moves(双向BFS)
- hdu 1372 Knight Moves (BFS)
- HDU1372 Knight Moves(bfs)
- (step4.2.1) hdu 1372(Knight Moves——BFS)
- HDU 1372 Knight Moves (BFS)
- HDU-1372 Knight Moves BFS