Knight Moves(POJ2243)

简介: Knight Moves(POJ2243)

题目:

A friend of you is doing research on the Traveling Knight Problem (TKP) where you are to find the

shortest closed tour of knight moves that visits each square of a given set of n squares on a

chessboard exactly once. He thinks that the most difficult part of the problem is determining the

smallest number of knight moves between two given squares and that, once you have accomplished

this, finding the tour would be easy.

Of course you know that it is vice versa. So you offer him to write a program that solves the “difficult”

part.

Your job is to write a program that takes two squares a and b as input and then determines the

number of knight moves on a shortest route from a to b.


Input

The input will contain one or more test cases. Each test case consists of one line containing two squares separated by one space. A square is a string consisting of a letter (a-h) representing the column and a digit (1-8) representing the row on the chessboard.

Output

For each test case, print one line saying “To get from xx to yy takes n knight moves.”.

Sample Input

e2 e4
a1 b2
b2 c3
a1 h8
a1 h7
h8 a1
b1 c3
f6 f6

Sample Output

To get from e2 to e4 takes 2 knight moves.
To get from a1 to b2 takes 4 knight moves.
To get from b2 to c3 takes 2 knight moves.
To get from a1 to h8 takes 6 knight moves.
To get from a1 to h7 takes 5 knight moves.
To get from h8 to a1 takes 6 knight moves.
To get from b1 to c3 takes 1 knight moves.
To get from f6 to f6 takes 0 knight moves.

思路:这个题就是搜索,知道马走的是日,所以可以枚举八个方向的坐标去一步一步的走,直到找到另一个点。我把输入的a-h转换为1-8,这样就可以建立一个8*8的矩阵。

程序代码:

#include<stdio.h>
#include<string.h>
struct node
{
  int x;//横坐标
  int y;//纵坐标
  int s;  //步数
}que[2050];
int main()
{
  int a[301][301]={0},book[200][200]={0},b[10];
  int next[8][2]={{-1,2},{1,2},{2,1},{2,-1},{1,-2},{-1,-2},{-2,-1},{-2,1}};
  int head,tail;
  char n1,m1;
  int i,j,k,m,n,p,q,stx,sty,tx,ty,flag;
  for(i=1;i<=8;i++)
    b[i+'a'-1]=i;
  while(scanf("%c%d %c%d",&n1,&n,&m1,&m)!=EOF)
  {
    getchar();
    stx=n;
    sty=n1-'a'+1;
    p=m;
    q=m1-'a'+1;
    head=tail=1;
    que[tail].x=stx;
    que[tail].y=sty;
    que[tail].s=0;
    tail++;
    book[stx][sty]=1; 
    flag=0;
    while(head<tail)
    {
      if(stx==p&&sty==q)
        break;
      for(k=0;k<8;k++)
      {
        tx=que[head].x+next[k][0];
        ty=que[head].y+next[k][1];
        if(tx<1||tx>8||ty<1||ty>8)
          continue;
        if(book[tx][ty]==0)
        {
          book[tx][ty]=1;
          que[tail].x=tx;
          que[tail].y=ty;
          que[tail].s=que[head].s+1;
          tail++;
        }
        if(tx==p&&ty==q)
        {
          flag=1;
          break;
        }
      }
      if(flag==1)
        break;
      head++;
    }
    printf("To get from %c%d to %c%d takes %d knight moves.\n",n1,n,m1,m,que[tail-1].s);
    for(i=0;i<200;i++)
      for(j=0;j<200;j++)
        book[i][j]=0;
  } 
  return 0;
}


相关文章
|
10月前
|
编解码 安全 JavaScript
《深入剖析鸿蒙生态原生应用:一次开发多端部署的技术革新》
鸿蒙生态通过“一次开发多端部署”技术,重新定义了应用开发模式。基于ArkTS语言与ArkUI框架,结合HUAWEI DevEco Studio工具,开发者可高效构建跨设备应用,实现无缝流转与协同工作。这一技术不仅降低了开发成本,提升了用户体验,还推动了全场景智能生态的繁荣。尽管面临性能优化与安全保护等挑战,但随着技术进步,鸿蒙将引领万物互联新时代,带来更智能便捷的生活体验。
331 0
|
Web App开发 资源调度 网络协议
Linux系统之部署IP工具箱MyIP
【10月更文挑战第5天】使用Docker部署Radicale日历和联系人应用Linux系统之部署IP工具箱MyIP
600 1
Linux系统之部署IP工具箱MyIP
|
存储 编解码 网络协议
阿里云服务器计算型c7、c7a、c8a、c8y实例区别参考
在阿里云目前的活动中,属于计算型实例规格的云服务器有计算型c7、计算型c7a、计算型c8a、计算型c8y这几个实例规格,相比于活动内的经济型e和通用算力型u1等实例规格来说,这些实例规格等性能更强,本文为大家介绍计算型c7、c7a、c8a、c8y实例区别及最新活动价格,以供参考。
1126 0
阿里云服务器计算型c7、c7a、c8a、c8y实例区别参考
|
运维 容灾 关系型数据库
介绍几种 MySQL 官方高可用方案
MySQL 官方提供了多种高可用部署方案,从最基础的主从复制到组复制再到 InnoDB Cluster 等等。本篇文章以 MySQL 8.0 版本为准,介绍下不同高可用方案架构原理及使用场景。
3151 3
介绍几种 MySQL 官方高可用方案
|
算法 数据库 C语言
图论可达性c语言实现
这篇文章详细解释了图论中可达性的概念,并提供了无向图和有向图的C语言实现代码,包括图的初始化、边的添加、深度优先搜索(DFS)以及可达性的检查。
240 0
图论可达性c语言实现
|
存储 数据可视化 BI
低代码平台全套源码,支持二次开发
低代码平台全套源码,支持二次开发
468 0
|
安全 数据安全/隐私保护
基于RBAC实现权限系统
基于RBAC实现权限系统
842 0
|
存储 编译器 Go
Golang深入浅出之-掌握Go语言Map:初始化、增删查改与遍历
【4月更文挑战第21天】Go语言中的`map`提供快速的键值对操作,包括初始化、增删查改和遍历。初始化时,推荐使用`make()`函数,如`make(map[string]int)`。插入和查询键值对直接通过索引访问,更新则重新赋值。删除键值对需用`delete()`函数,确保键存在。遍历map常用`for range`,注意避免在遍历中修改map。了解这些并避免易错点,能提升代码效率和可读性。
355 1
Golang深入浅出之-掌握Go语言Map:初始化、增删查改与遍历
|
NoSQL 关系型数据库 MySQL
实时计算 Flink版产品使用问题之如何确保多并发sink同时更新Redis值时,数据能按事件时间有序地更新并且保持一致性
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
Web App开发
Python+selenium 实现趣头条的短视频自动上传与发布实例演示(支持抖音、快手、b站、小红书等平台)
Python+selenium 实现趣头条的短视频自动上传与发布实例演示(支持抖音、快手、b站、小红书等平台)
702 0