NOI - OpenJudge - 2.5基本算法之搜索 - 1490:A Knight‘s Journey - 超详解析(含AC代码)

点赞关注吧~

1490:A Knight's Journey

  • 查看
  • 提交
  • 统计
  • 提问

总时间限制: 

1000ms

内存限制: 

65536kB

描述

Background
The knight is getting bored of seeing the same black and white squares again and again and has decided to make a journey
around the world. Whenever a knight moves, it is two squares in one direction and one square perpendicular to this. The world of a knight is the chessboard he is living on. Our knight lives on a chessboard that has a smaller area than a regular 8 * 8 board, but it is still rectangular. Can you help this adventurous knight to make travel plans?

Problem
Find a path such that the knight visits every square once. The knight can start and end on any square of the board.

输入

The input begins with a positive integer n in the first line. The following lines contain n test cases. Each test case consists of a single line with two positive integers p and q, such that 1 <= p * q <= 26. This represents a p * q chessboard, where p describes how many different square numbers 1, . . . , p exist, q describes how many different square letters exist. These are the first q letters of the Latin alphabet: A, . . .

输出

The output for every scenario begins with a line containing "Scenario #i:", where i is the number of the scenario starting at 1. Then print a single line containing the lexicographically first path that visits all squares of the chessboard with knight moves followed by an empty line. The path should be given on a single line by concatenating the names of the visited squares. Each square name consists of a capital letter followed by a number.
If no such path exist, you should output impossible on a single line.

样例输入

3
1 1
2 3
4 3

样例输出

Scenario #1:
A1Scenario #2:
impossibleScenario #3:
A1B3C1A2B4C2A3B1C3A4B2C4

来源

TUD Programming Contest 2005, Darmstadt, Germany

翻译

背景 这位骑士厌倦了一遍又一遍地看到相同的黑白方块,决定开始一场环游世界的旅程。骑士每次移动时,向一个方向走两个方块,然后垂直于此再走一个方块。这位骑士的世界是他所生活的棋盘。我们的骑士生活在一个比标准的8*8棋盘面积小的棋盘上,但它仍然是矩形的。您能帮助这位冒险的骑士制定旅行计划吗? 

问题 找到一条路径,使得骑士访问每个方块一次。骑士可以从棋盘的任意一个方块开始并结束。

输入输出

这段文本描述了一个输入输出规范,要求实现一个程序,根据输入的测试用例,在国际象棋棋盘上使用骑士的走法找出一条经过所有方格的最短路径,并按照字典序输出路径。如果不存在这样的路径,则输出"impossible"。

具体要求如下:

  • 输入包含多个测试用例,每个测试用例包含两个正整数 p 和 q,表示一个 p*q 的国际象棋棋盘,其中 p 表示横向的不同方格数,q 表示纵向的不同方格数,且满足 1 <= p * q <= 26。
  • 输出对每个测试用例,首先输出一行 "Scenario #i:",其中 i 表示测试用例的序号,从 1 开始。
  • 然后输出一行,包含经过所有方格的最短路径,按照字典序输出,每个方格用一个大写字母加一个数字表示。
  • 如果不存在满足条件的路径,则输出一行 "impossible"。

希望这样的翻译对您有所帮助。如果需要进一步解释或有其他问题,请随时告诉我。

走法 

在国际象棋中,骑士的移动方式是“日”字形,即每次移动两格沿一个方向,然后再移动一格与之垂直的方向。这种移动方式使得骑士在棋盘上的路径呈现出 L 字形。骑士可以沿着横向或纵向移动两格,然后再沿着垂直于之前移动方向的方向移动一格,或者沿着纵向或横向移动一格,然后再沿着垂直于之前移动方向的方向移动两格。

这种特殊的移动方式使得骑士在棋盘上可以覆盖到每一个方格,而不会重复经过同一个方格。因此,要找到一条路径,使得骑士访问每个方格一次,可以利用骑士的 L 字形移动规则,按照特定顺序遍历整个棋盘。可以通过深度优先搜索(DFS)或者回溯算法来找到这样一条路径。

这里是国际象棋中骑士的走法示意图:

  1  2  3  4  5  6  7  8
1    .    .    .    .    .
2 .    .    .    .    .    
3    .    .    .    .    .
4 .    .    N    .    .    
5    .    .    .    .    .
6 .    .    .    .    .
7    .    .    .    .    .
8 .    .    .    .    .

在上面的示意图中,N 代表骑士的位置,骑士可以移动到示意图中的任何一个点。骑士的移动路径将形成 L 字形,即每次移动两格沿一个方向,然后再移动一格与之垂直的方向,或者每次移动一格沿一个方向,然后再移动两格与之垂直的方向。

代码及题解

标准代码

#include<iostream>
#include<cstring>
using namespace std;bool vis[30][30], flag;
int visnum, p, q;
char path[60];
int dx[8]={-2,-2,-1,-1,1,1,2,2};
int dy[8]={-1,1,-2,2,-2,2,-1,1};void dfs(int num,int x,int y)
{if(num==visnum){for(int i=0;i<2*visnum;i++) cout<<path[i];cout<<endl<<endl;flag=true;return ;}for(int i=0;i<8&&!flag;i++){int xx=x+dx[i];int yy=y+dy[i];if(xx>0&&yy>0&&xx<=q&&yy<=p&&!vis[xx][yy]){vis[xx][yy]=true;path[2*num]='A'+xx-1;path[2*num+1]='0'+yy;dfs(num+1,xx,yy);vis[xx][yy]=false;}}
}int main()
{int n;cin>>n;int m=1;while(n--){cout<<"Scenario #"<<m++<<":"<<endl;cin>>p>>q;memset(vis,false,sizeof(vis));vis[1][1]=true;visnum=p*q;flag=false;path[0]='A'; path[1]='1';dfs(1,1,1);if(!flag) cout<<"impossible"<<endl<<endl;}return 0;}

手写代码

#include <bits/stdc++.h>
using namespace std;
int t;//多测
int p,q;//p->列 q->行
bool visited[30][30];
bool flag;
int movex[8]={-2,-2,-1,-1,1,1,2,2};
int movey[8]={-1,1,-2,2,-2,2,-1,1};
/* 位移增量上下搭配 */
int turn=1;
char res[60];
void dfs(int num,int x,int y){visited[x][y]=true;if(num==p*q){//走完了for(int i=0;i<p*q*2;i++){cout<<res[i];}cout<<endl<<endl;flag=true;return ;}else{for(int i=0;i<8&&!flag;i++){int X=x+movex[i];int Y=y+movey[i];if(!visited[X][Y]&&((X>0&&X<=q)&&(Y>0&&Y<=p))){res[num*2]='A'+X-1;res[num*2+1]='0'+Y;visited[X][Y]=true;dfs(num+1,X,Y);visited[X][Y]=false;}}}return ;
}
int main(){cin>>t;while(t--){cin>>p>>q;memset(visited,false,sizeof(visited));visited[1][1]=true;flag=false;res[0]='A';res[1]='1';cout<<"Scenario #"<<turn<<":"<<endl;dfs(1,1,1);if(!flag){cout<<"impossible"<<endl<<endl;}turn++;}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/793085.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue开发加速器:Chrome的vue-devtools插件解决开发难题

I. 简介 Vue.js是一个流行的前端JavaScript框架&#xff0c;它允许开发人员轻松构建可扩展的Web应用程序和移动应用程序。vue-devtools是一个Chrome浏览器的扩展程序&#xff0c;它是由Vue.js官方维护的一款强大的调试工具。结合Vue.js和vue-devtools插件&#xff0c;开发人员…

前端三剑客 —— CSS (第五节)

目录 内容回顾&#xff1a; 特殊样式 特殊样式 CSS变量 常见函数 倒影效果 页面布局 Table 布局&#xff08;了解即可&#xff09; DIVCSS布局 弹性布局 1&#xff09;不使用弹性布局&#xff0c;而是使用DIVCSS 2&#xff09;使用弹性布局实现导航菜单 内容回顾…

echart 仪表盘实现指针的渐变色及添加图片

需求&#xff1a; 在仪表盘中设置指针为渐变色&#xff0c;并在仪表盘中间添加图片。 实现重点&#xff1a; 1、仪表盘指针渐变色的实现 渐变色通过设置pointer的itemStyle属性内的color实现&#xff0c;重点是echart版本&#xff0c;这个原本使用4.8.0的版本不起作用&#xff…

排序基础---插入排序及在c++中开辟二维数组

排序基础---插入排序 插入排序是一种比较排序。 选出一个临时变量tmp. 然后弄一个end&#xff0c;end最初可以是0. 那么tmp便应该是a[end1] 最终的目的是为了使一个序列有序&#xff0c;所以应该让tmp依次与前[0,end],进行比较最后插入到合适的位置。 void insert_sort(…

AD20全流程的使用笔记

目录 首先一个完整的AD工程文件需要我们自己建立的文件有这些&#xff1a; 新建工程&#xff1a; 从现有的工程文件中将元件添加到原理图库&#xff1a; 元件的摆放&#xff1a; 器件的复制及对齐&#xff1a; 导线、Netlabe、端口的添加&#xff1a; Value值的校对&…

SQL注入---盲注

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 一.盲注概述 注是一种SQL注入攻击的形式&#xff0c;在这种攻击中&#xff0c;攻击者向目标应用程序发送恶意注入代码&#xff0c;然后通过观察应用程序的响应来推断出数据库中的信息。与常规的…

设计模式——抽象工厂模式02

如果是工厂模式是对同一类商品进行抽象然后生产。 那么抽象工厂模式是对工厂的抽象&#xff0c;每个工厂都能生产多种产品&#xff0c;不同工厂生产的商品性质相同&#xff0c;但外观&#xff0c;品牌会略有差异。 设计模式&#xff0c;一定要敲代码理解 商品抽象 public in…

每日五道java面试题之ZooKeeper篇(一)

目录&#xff1a; 第一题. ZooKeeper 是什么&#xff1f;第二题. Zookeeper 文件系统第三题. Zookeeper 怎么保证主从节点的状态同步&#xff1f;第四题. 四种类型的数据节点 Znode第五题 . Zookeeper Watcher 机制 – 数据变更通知 第一题. ZooKeeper 是什么&#xff1f; Zoo…

MySQL面试题系列-6

MySQL是一个关系型数据库管理系统&#xff0c;由瑞典 MySQL AB 公司开发&#xff0c;属于 Oracle 旗下产品。MySQL是最流行的关系型数据库管理系统之一&#xff0c;在 WEB 应用方面&#xff0c;MySQL是最好的RDBMS (Relational Database Management System&#xff0c;关系数据…

flutter项目ffi相关

Flutter 使用FFICustomPainter实现全平台渲染视频_flutter ffi-CSDN博客

libusb Qt使用记录

1.libusb 下载 &#xff0c;选择编译好的二进制文件&#xff0c;libusb-1.0.26-binaries.7z libusb Activity 2. 解压 3. 在 Qt Widgets Application 或者 Qt Console Application 工程中导入库&#xff0c;Qt 使用的是 minggw 64编译器&#xff0c;所以选择libusb-MinGW-x64。…

基于STM32的电子钟与万年历设计

1、功能 硬件部分&#xff1a; (1). 采用 STM32F103ZET6作为主控芯片&#xff0c; 负责驱动其他外设模块 (2). 实时时钟采用 STM32 本身的 RTC (3). TFT(LCD)彩色显示屏 正点原子的3.5寸触摸屏&#xff08;NT3510&#xff09; (4). DS18B20 温度传感器 支持的功能&#xf…

C语言—用EasyX实现反弹球消砖块游戏

代码效果如下 #undef UNICODE #undef _UNICODE #include<graphics.h> #include<conio.h> #include<time.h> #include<stdio.h>#define width 640 #define high 480 #define brick_num 10int ball_x, ball_y; int ball_vx, ball_vy; int radius; int ba…

使用 Clickhouse 集成的表引擎同步数据方式详解

Clickhouse作为一个列式存储分析型数据库&#xff0c;提供了很多集成其他组件的表引擎数据同步方案。 官网介绍 一 Kafka 表引擎 使用Clickhouse集成的Kafka表引擎消费Kafka写入Clickhouse表中。 1.1 流程图 1.2 建表 根据上面的流程图需要建立三张表&#xff0c;分别Click…

Vue 组合式 API

Vue 组合式 API 生命周期钩子 在 Vue2 中&#xff0c;我们通过以下方式实现生命周期钩子函数&#xff1a; export default {beforeMount() {console.log(V2 beforeMount!)},mounted() {console.log(V2 mounted!)} }; 在 Vue3 组合 API 中实现生命周期钩子函数可以在 setup()…

鸿蒙组件学习_Image组件

说明 该组件从API Version 7 开始支持 使用网络图片时,需要申请ohos.permission.INTERNET 参数 必填 src 图片的数据源,支持本地图片和网络图片 不支持跨包跨模块调用该Image组件,建议使用$r方式来管理需全局使用的图片资源。属性 alt 加载时显示的占位图&#xf…

Linux云计算之网络基础8——IPV6和常用网络服务

目录 一、IPV6基础 IPV6详解 IPv6数据报的基本首部 IPv6数据报的扩展首部 IPv6地址的表示方法 IPv6地址分类 网际控制报文协议ICMPv6 二、cisco基于IPV6的配置 cisco基于IPV6的配置步骤 模拟配置 三、HTML基础介绍 文档的结构 动手操作一下 四、常用网络服务介绍…

【架构一】CS架构和BS架构

最近在做架构的设计工作&#xff0c;做技术选型难免要区分好CS架构和BS架构。下面就来谈谈两者的区别。 首先CS架构分两层C/S和三层C/S架构。最开始人们都是用的两层CS架构&#xff0c;但它的缺点也孕育而生。 两层CS架构的缺点&#xff1f; &#xff08;1&#xff09;服务器…

B2029 大象喝水

题目描述 一只大象口渴了&#xff0c;要喝 20 升水才能解渴&#xff0c;但现在只有一个深 ℎh 厘米&#xff0c;底面半径为 r 厘米的小圆桶 &#xff08;h 和 r 都是整数&#xff09;。问大象至少要喝多少桶水才会解渴。 Update&#xff1a;数据更新&#xff0c;这里我们近似地…

网络编程(TCP、UDP)

文章目录 一、概念1.1 什么是网络编程1.2 网络编程中的基本知识 二、Socket套接字2.1 概念及分类2.2 TCP VS UDP2.3 通信模型2.4 接口方法UDP数据报套接字编程TCP流套接字编程 三、代码示例3.1 注意点3.2 回显服务器基于UDP基于TCP 一、概念 首先介绍了什么是网络编程&#xff…