UVA439-骑士的移动 Knight Moves(BFS)

简介: UVA439-骑士的移动 Knight Moves(BFS)


AC Code:


#include<bits/stdc++.h>
using namespace std;
#define N 101
struct node {//定义结构体 
  int x,y,s;//分别为该点的横坐标、纵坐标、步数 
}que[N*N];
int book[N][N];//标记数组 
int dx[]={-1,-2,-2,-1,1,2,2,1};//马可以向8个方向移动 
int dy[]={2,1,-1,-2,-2,-1,1,2};
bool judge(int x,int y) {
  if(x>=1&&x<=8&&y>=1&&y<=8&&book[x][y]==0) {//不越界并且这个点没有访问过 
    return true;
  }
  return false;
}
int main() {
  int head,tail,flag,sx,sy,ex,ey,minn;
  char a[10],b[10];
  while(~scanf("%s%s",a,b)) {//每组样例为两个字符串 
    flag=0;//标记变量 
    head=tail=1;//队头队尾初始化为1 
    memset(book,0,sizeof(book));//标记数组清零 
    sx=a[0]-'a'+1;//将字符串中的每个字符转换为对应的ASCII码 
    sy=a[1]-'0';
    ex=b[0]-'a'+1;
    ey=b[1]-'0';
    if(sx==ex&&sy==ey) {//特判:如果样例输入中起点和终点一样,则直接到达 
      printf("To get from %s to %s takes 0 knight moves.\n",a,b);
    }else {
      que[head].x=sx;//起点坐标入队 
      que[head].y=sy;
      que[head].s=0;//步数为0 
      book[sx][sy]=1;//标记这个点已被访问过 
      tail++;//起点坐标入队之后,队尾向后移动一格 
      while(head<tail) {
        for(int i=0;i<8;i++) {//8个方向搜索 
          int tx=que[head].x+dx[i];//下一个点的坐标 
          int ty=que[head].y+dy[i];
          if(judge(tx,ty)) { 
            que[tail].x=tx;//新的点坐标入队 
            que[tail].y=ty;
            que[tail].s=que[head].s+1;//步数等于上一个点的步数加+1 
            tail++;//每有一个新的点入队,队尾都要向后移动一格 
            book[tx][ty]=1;//标记该点 
          }
          if(tx==ex&&ty==ey) {//如果此时走到终点 
            flag=1;//修改标记变量为1 
            break;//退出循环 
          }
        }
        if(flag==1) {//依次退出循环 
          break;
        }
        head++;//未走到终点,队头向后移动一格,继续下一个点的搜索 
      }
      //注意这里的步数,请仔细看代码第43行,走到终点之后,无论如何队尾又向后移动了一格
      //之后执行到第46行时,才会判断是否到达终点,进一步退出循环,所以这里对应的是是队尾回退一格的那个点的步数 
      printf("To get from %s to %s takes %d knight moves.\n",a,b,que[tail-1].s);
    }
  }
  return 0;
}
相关文章
|
8月前
Knight Moves(POJ2243)
Knight Moves(POJ2243)
|
算法
1091 zoj Knight Moves的BFS算法和DFS
1091 zoj Knight Moves的BFS算法和DFS
73 0
|
机器学习/深度学习
1257:Knight Moves 2021-01-09
1257:Knight Moves 2021-01-09
|
C++
【PAT甲级 - C++题解】1096 Consecutive Factors
【PAT甲级 - C++题解】1096 Consecutive Factors
86 0
UVA699 下落的树叶 The Falling Leaves
UVA699 下落的树叶 The Falling Leaves
UVA699 下落的树叶 The Falling Leaves
POJ-2488,A Knight's Journey(DFS)
POJ-2488,A Knight's Journey(DFS)
HDOJ/HDU 1372 Knight Moves(经典BFS)
HDOJ/HDU 1372 Knight Moves(经典BFS)
141 0