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.rhkb.cn/news/300819.html

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

相关文章

【WEEK6】 【DAY7】MD5 Encryption Transactions【English Version】

2024.4.7 Sunday Following the previous article 【WEEK6】 【DAY3】MySQL Functions【English Version】 Contents 5.3. MD5 Encryption5.3.1. Introduction5.3.2. Testing MD5 Encryption5.3.2.1. Plain Text Passwords5.3.2.2. Implementing Data Encryption5.3.2.3. Encry…

实景三维在文化旅游领域的应用

实景三维技术&#xff0c;作为一种前沿的科技手段&#xff0c;近年来在文化旅游领域的应用逐渐崭露头角。它能够将真实世界的场景以三维的形式精确呈现&#xff0c;为游客带来身临其境的体验&#xff0c;为文化旅游注入新的活力。本文将探讨实景三维在文化旅游领域的应用及其所…

npm版本切换工具nvm

有了nvm&#xff0c;可以在一台机器上同时安装多个版本的nodejs&#xff0c;然后指定使用某个版本。 前端开发的时候&#xff0c;安装依赖一直是个令我头痛的问题。总是报错&#xff0c;或者不是少了这样就是少了那样&#xff0c;鸡飞狗走。以往&#xff0c;一般要装个enpm&am…

【java的本地锁到分布式锁介绍】

文章目录 1.java本地自带锁介绍及应用synchronized&#xff08;1&#xff09;synchronized原理和优化&#xff08;2&#xff09;synchronized作用&#xff08;3&#xff09;synchronized的使用 CAS(1) CAS原理&#xff08;2&#xff09;CAS和synchronized优缺点 lock 2.分布式锁…

基于Spring Boot的网上书城系统(带文档)

主要功能 本次设计任务是要设计一个网上书城管理系统&#xff0c;通过这个系统能够满足网上书城的管理及用户的图书信息管理及购物功能。系统的主要功能包括&#xff1a;首页、个人中心、用户管理、图书类型管理、图书分类管理、图书信息管理、我的收藏管理、系统管理、订单管…

c++的学习之路:14、list(1)

本章讲一下如何使用list&#xff0c;代码在文章末 目录 一、list介绍 二、增 三、删 四、查和改 五、交换 六、代码 一、list介绍 首先还是看一看官方文档的介绍如下图&#xff0c;如下方五点&#xff1a; 1. list是可以在常数范围内在任意位置进行插入和删除的序列式…

面向电力行业定制安全云工作站解决方案,麒麟信安出席2024年电力企业信创替代技术研讨会

日前&#xff0c;由中国电子企业协会主办的“2024年电力企业信创替代技术研讨会”在江苏南京正式召开。会议以国家推进实现自主可控、加快建设“数字中国”为大背景&#xff0c;聚焦电力企业紧抓“信创替代”机遇&#xff0c;通过安全可靠的软硬件迭代升级&#xff0c;实现企业…

2024年妈妈杯数学建模MathorCup数学建模思路B题思路解析+参考成品

1 赛题思路 (赛题出来以后第一时间在群内分享&#xff0c;点击下方群名片即可加群) 2 比赛日期和时间 报名截止时间&#xff1a;2024年4月11日&#xff08;周四&#xff09;12:00 比赛开始时间&#xff1a;2024年4月12日&#xff08;周五&#xff09;8:00 比赛结束时间&…

milvus search api的数据结构

search api的数据结构 此api的功能是向量相似度搜索(vector similarity search) 一个完整的search例子: 服务端collection是一个hnsw类型的索引。 import random from pymilvus import (connections,Collection, )dim 128if __name__ __main__:connections.connect(alias…

【go】模板展示不同k8s命名空间的deployment

gin模板展示k8s命名空间的资源 这里学习如何在前端单页面&#xff0c;调用后端接口展示k8s的资源 技术栈 后端 -> go -> gin -> gin模板前端 -> gin模板 -> html jsk8s -> k8s-go-client &#xff0c;基本资源(deployment等) 环境 go 1.19k8s 1.23go m…

面向低碳经济运行目标的多微网能量互联优化调度matlab程序

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 运用平台 matlabgurobi 程序简介 该程序为多微网协同优化调度模型&#xff0c;系统在保障综合效益的基础上&#xff0c;调度时优先协调微网与微网之间的能量流动&#xff0c;将与大电网的互联交互作为备用…

ES学习笔记01

1.ES安装 下载地址&#xff1a; es官网下载 这里使用的是7.8.0的版本信息 下载完成后解压即可完成安装 2.启动运行 点击bin目录下的elasticsearch.bat文件即可启动 在浏览器中输入localhost:9200显示如下&#xff1a; 在路径中加入对应访问后缀即可访问对应信息 如&#…

c++11 标准模板(STL)本地化库 - 平面类别 - (std::ctype) 定义字符分类表(七)

本地化库 本地环境设施包含字符分类和字符串校对、数值、货币及日期/时间格式化和分析&#xff0c;以及消息取得的国际化支持。本地环境设置控制流 I/O 、正则表达式库和 C 标准库的其他组件的行为。 平面类别 定义字符分类表 std::ctype template< class CharT > clas…

HiveSQL如何生成连续日期剖析

HiveSQL如何生成连续日期剖析 情景假设&#xff1a; 有一结果表&#xff0c;表中有start_dt和end_dt两个字段&#xff0c;&#xff0c;想要根据开始和结束时间生成连续日期的多条数据&#xff0c;应该怎么做&#xff1f;直接上结果sql。&#xff08;为了便于演示和测试这里通过…

lua学习笔记9(字典的学习)

print("********************字典的学习***********************") a{["凌少"]"傻逼",["我"]"天才",["age"]24,["daihao"]114514,["8848"]20000} --访问单个变量 print(a["凌少"])…

社交媒体市场:揭示Facebook的商业模式

在数字化时代&#xff0c;社交媒体已经成为人们生活中不可或缺的一部分。Facebook作为全球最大的社交媒体平台之一&#xff0c;其商业模式的运作方式对于了解社交媒体市场的发展趋势和影响力至关重要。本文将深入探讨Facebook的商业模式&#xff0c;剖析其运作机制&#xff0c;…

hadoop分布式计算组件

什么是计算、分布式计算&#xff1f; 计算&#xff1a;对数据进行处理&#xff0c;使用统计分析等手段得到需要的结果 分布式计算&#xff1a;多台服务器协同工作&#xff0c;共同完成一个计算任务 分布式计算常见的2种工作模式 分散->汇总(MapReduce就是这种模式)中心调…

Docker 引擎离线安装包采集脚本

文章目录 一、场景说明二、脚本职责三、参数说明四、操作示例五、注意事项 一、场景说明 本自动化脚本旨在为提高研发、测试、运维快速部署应用环境而编写。 脚本遵循拿来即用的原则快速完成 CentOS 系统各应用环境部署工作。 统一研发、测试、生产环境的部署模式、部署结构、…

docker 部署 Epusdt - 独角数卡 dujiaoka 的 usdt 支付插件

部署 部署说明 部署之前必须注意的几点事项,该教程不一定适合所有用户: 本教程主要是使用 docker 部署,宝塔用户或宿主机直接安装的用户请直接参考官网教程.本教程是独立部署 epusdt,使用独立的mysql和redis,与dujiaoka项目分开. 在研究的过程中发现 epusdt 也需要用到 mys…

如何成为一名优秀的工程师下

身为工程师&#xff0c;理所当然要重视实践&#xff0c;自然科学不管发展到何时都离不开实验。 电子学本身就是 为了指导工程实践。所以不要谈空洞的理论。现在很多毕业生都面临这样的问题&#xff0c;总是谈一些空洞的理论&#xff0c;甚至错误的但还不以为然的理论。实践可以…