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;
}
相关文章
|
消息中间件 缓存 NoSQL
|
10月前
|
前端开发 Linux 数据库
CMS网站管理系统如何选择CMS建站?
本文介绍了几款常用CMS系统,包括PageAdmin CMS,适用于公司、政务和学校等事业单位网站。该系统有上千款模板库,适合基础一般建站用户需求,同时支持Windows、Linux、麒麟服务器等多环境版本,支持国产化改造。
177 6
|
JavaScript 应用服务中间件 Linux
开源项目推荐:C/C++语言版本的http server和client,请关注RESTful
开源项目推荐:C/C++语言版本的http server和client,请关注RESTful
4995 0
|
小程序 前端开发 JavaScript
微信小程序实现抽奖大转盘
微信小程序实现抽奖大转盘
1087 0
|
Java Linux Windows
kali burpsuite 安装与使用
作者主页:https://www.couragesteak.com/
kali burpsuite 安装与使用
|
存储 小程序 关系型数据库
动手搭建真正的网站(二):试试全世界41%的网站都在用的建站工具
单刀直入,这个工具叫做WordPress,简称WP,它是用PHP语言写成的,使用MySQL数据库来存储数据
389 0
|
测试技术
Knight Moves(骑士移动) (bfs) POJ-2243
题目:Knight Moves (骑士移动)
|
移动开发 JavaScript 前端开发
100多个经典常用的网站源码大全实例演示和下载
推荐源码 /Source   更多 > 06-19 最新微信夹娃娃抓娃娃抓猴子游戏三级分销源码小游戏 06-18 最新PHP+Mysql实现新丽都娱乐时时彩系统 06-18...
5552 0
|
机器学习/深度学习 网络协议 Linux
Linux 下获取LAN中指定IP的网卡的MAC(物理地址)
// all.h// 2005/06/20,a.m. wenxy #ifndef _ALL_H#define _ALL_H #include #include #include #include #include #include #include #include #include   //...
1161 0