hdu 1372 Knight Moves 简单bfs
2017-04-09 20:18
363 查看
题意:给定一个8*8棋盘的起点和终点,没有任何阻碍物,求马走到终点的最小步数(国际象棋的走法)
思路:直接bfs,向相邻状态扩展,每次步数加1,直到到达终点,注意棋盘的边界,起点和终点。
马的走法:马的走法由两个不同 步骤组成,先沿横线或直线走一格,然后沿斜线离原格方向一格,在走第一格时即使该格已有棋子占据也仍可行走
![](https://img-blog.csdn.net/20170409201745957?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY2hlbl9taW5naHVp/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
思路:直接bfs,向相邻状态扩展,每次步数加1,直到到达终点,注意棋盘的边界,起点和终点。
马的走法:马的走法由两个不同 步骤组成,先沿横线或直线走一格,然后沿斜线离原格方向一格,在走第一格时即使该格已有棋子占据也仍可行走
#include<cstdio> #include<queue> #include<cstring> using namespace std; int vis[10][10]; int Move[]={1,0,-1,0,1};//x+1,y x,y-1 x-1,y x,y+1 int step; struct node { int i,j; node(int i,int j):i(i),j(j){ } }; bool check(int i,int j) { return i>=1&&i<=8&&j>=1&&j<=8; } void bfs(int si,int sj,int ei,int ej) { queue<node> q; vis[si][sj]=1; q.push(node(si,sj)); while(!q.empty()) { int sz = q.size(); while(sz--) { node a = q.front();q.pop(); int di=a.i;int dj=a.j; if(di==ei&&dj==ej)return ; for(int i=0;i<4;i++) { int ki=di+Move[i]; int kj=dj+Move[i+1]; int ci,cj; if(Move[i]==1) { ci=ki+1; for(int j=-1;j<=1;j++) if(j!=0) { cj=kj+j; if(check(ci,cj)&&!vis[ci][cj]) { q.push(node(ci,cj)); vis[ci][cj]=1; } } } if(Move[i]==-1) { ci=ki-1; for(int j=-1;j<=1;j++) if(j!=0) { cj=kj+j; if(check(ci,cj)&&!vis[ci][cj]) { q.push(node(ci,cj)); vis[ci][cj]=1; } } } if(Move[i+1]==1) { cj=kj+1; for(int j=-1;j<=1;j++) if(j!=0) { ci=ki+j; if(check(ci,cj)&&!vis[ci][cj]) { q.push(node(ci,cj)); vis[ci][cj]=1; } } } if(Move[i+1]==-1) { cj=kj-1; for(int j=-1;j<=1;j++) if(j!=0) { ci=ki+j; if(check(ci,cj)&&!vis[ci][cj]) { q.push(node(ci,cj)); vis[ci][cj]=1; } } } } } step++; } } int main() { char a[2],b[2]; while(scanf("%s%s",a,b)!=EOF) { int sj=a[0]-'a'+1; int si=a[1]-'0'; int ej=b[0]-'a'+1; int ei=b[1]-'0'; step=0; memset(vis,0,sizeof(vis)); //printf("%d %d\n%d %d\n",si,sj,ei,ej); bfs(si,sj,ei,ej); printf("To get from %s to %s takes %d knight moves.\n",a,b,step); } }
相关文章推荐
- bfs简单题----Knight Moves(hdu 1372)
- HDU - 1372 Knight Moves ( 简单BFS + floodfill )
- hdu 1372 Knight Moves (简单bfs,囧!)
- HDU 1372Knight Moves(简单的BFS)
- HDU 1372 Knight Moves 广度优先搜索 bfs
- HDU 1372 Knight Moves (搜索 使用 dfs bfs两种实现)
- HDU 1372 Knight Moves【BFS】
- HDU ACM 1372 Knight Moves (BFS)
- (step4.2.1) hdu 1372(Knight Moves——BFS)
- hdu 1372 Knight Moves(BFS)
- hdu 1372 Knight Moves (水bfs)
- HDU 1372 广度优先搜索(BFS) Knight Moves
- HDU-#1372 Knight Moves(双向BFS)
- HDU 1372 Knight Moves,bfs
- HDU 1372 Knight Moves【BFS】
- HDU-1372 Knight Moves (BFS)
- POJ 2243 || HDU 1372:Knight Moves(BFS)
- hdu1372 Knight Moves BFS 搜索
- HDU-1372 Knight Moves BFS
- hdu 1372 Knight Moves (BFS)