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

news2025/1/16 15:43:32

点赞关注吧~

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:
A1

Scenario #2:
impossible

Scenario #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.coloradmin.cn/o/1569460.html

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

相关文章

数据仓库面试总结

文章目录 1.什么是数据仓库&#xff1f;2.ETL是什么&#xff1f;3.数据仓库和数据库的区别&#xff08;OLTP和OLAP的区别&#xff09;4.数据仓库和数据集市的区别5.维度分析5.1 什么是维度&#xff1f;5.2什么是指标&#xff1f; 6.什么是数仓建模&#xff1f;7.事实表7.维度表…

StarRocks实战——华米科技埋点分析平台建设

目录 前言 一、原有方案及其痛点 二、引入StarRocks 三、方案改造 3.1 架构设计 3.2 数据流程 3.3 性能指标 3.4 改造收益 前言 华米科技是一家基于云的健康服务提供商&#xff0c;每天都会有海量的埋点数据&#xff0c;以往基于HBase建设的埋点计算分析项目往往效率上…

号卡极团分销管理系统 index.php SQL注入漏洞复现

0x01 产品简介 号卡极团分销管理系统,同步对接多平台,同步订单信息,支持敢探号一键上架,首页多套UI+商品下单页多套模板,订单查询支持实时物流信息、支持代理商自定义域名、泛域名绑定,内置敢探号、172平台、号氪云平台第三方接口以及号卡网同系统对接! 0x02 漏洞概述…

在ssh 工具 Linux screen会话中使用鼠标进行上下滚动

经过几次发现 除xshell外&#xff0c; WindTerm finalshell MobaXterm 都是进入会话后&#xff0c;发现其界面无法滚动屏幕向上查看 如果想要在Linux screen会话中使用鼠标进行上下滚动。必须首先进入该screen的回滚(scrollback模式)才能进行上下滚动 第一步&#xff…

RobotFramework测试框架(2)-测试用例

创建测试数据 测试数据语法 这里的测试数据就是指的测试用例。 测试文件组织 测试用例的组织层次结构如下&#xff1a; 在测试用例文件&#xff08; test case file &#xff09;中建立测试用例 一个测试文件自动的建成一个包含了这些测试用例的测试集&#xff08; test s…

TCP/IP协议、HTTP协议和FTP协议等网络协议包简介

文章目录 一、常见的网络协议二、TCP/IP协议1、TCP/IP协议模型被划分为四个层次2、TCP/IP五层模型3、TCP/IP七层模型 三、FTP网络协议四、Http网络协议1、Http网络协议简介2、Http网络协议的内容3、HTTP请求协议包组成4、HTTP响应协议包组成 一、常见的网络协议 常见的网络协议…

A First Course in the Finite Element Method【Daryl L.】|PDF电子书

专栏导读 作者简介&#xff1a;工学博士&#xff0c;高级工程师&#xff0c;专注于工业软件算法研究本文已收录于专栏&#xff1a;《有限元编程从入门到精通》本专栏旨在提供 1.以案例的形式讲解各类有限元问题的程序实现&#xff0c;并提供所有案例完整源码&#xff1b;2.单元…

STM32 PWM方式读取AS5600磁编码器数据

HAL STM32 PWM方式读取AS5600磁编码器获取角度例程 &#x1f4cd;相关篇《STM32 软件I2C方式读取AS5600磁编码器获取角度例程》 &#x1f4cc;《HAL STM32 硬件I2C方式读取AS5600磁编码器获取角度例程》 &#x1f341;先通过IIC读取的角度值和逻辑分析仪抓取的AS5600 OUT引脚…

超越聊天机器人:语言模型揭秘

原文&#xff1a;More than a Chatbot 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 致谢 我要感谢激励我写这本书的跨学科项目合作伙伴&#xff0c;特别是“BIAS&#xff1a;减轻劳动力市场 AI 多样性偏见”地平线欧洲项目&#xff0c;以及我的研究小组和其他研究同…

MySQL-逻辑架构:逻辑架构分析、SQL执行流程、数据库缓冲池

逻辑架构 1. 逻辑架构剖析 1.1 第1层&#xff1a;连接层 系统&#xff08;客户端&#xff09;访问MySQL服务器前&#xff0c;做的第一件事就是建立TCP连接。 经过三次握手建立连接成功后&#xff0c;MySQL服务器对TCP传输过来的账号密码做身份认证、权限获取。 用户名或密码…

玩转ChatGPT:Kimi测评(图片识别)

一、写在前面 ChatGPT作为一款领先的语言模型&#xff0c;其强大的语言理解和生成能力&#xff0c;让无数用户惊叹不已。然而&#xff0c;使用的高门槛往往让国内普通用户望而却步。 最近&#xff0c;一款由月之暗面科技有限公司开发的智能助手——Kimi&#xff0c;很火爆哦。…

【Latex】参考文献标号未对齐解决方案

Latex写论文时发现最后参考文献标号出现如下没有对齐的情况&#xff1a; 解决方案&#xff1a; 将参考文献开始出的序号1改为99&#xff08;或者其他大点的数字也可以&#xff09; ⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇

非关系型数据库-----------探索Redis支持五种数据类型

目录 一、Redis支持五种数据类型 1.String&#xff08;字符串&#xff09; 2.Hash&#xff08;哈希&#xff09; 3.List&#xff08;列表&#xff09; 4.Set&#xff08;集合&#xff09; 5.sorted set(有序集合) 二、Redis的字符串类型string 1、 SET/GET/APPEND/STRL…

【考研经验贴】24考研860软件工程佛系上岸经验分享【丰富简历、初复试攻略、导师志愿、资料汇总】

&#x1f60a;你好&#xff0c;我是小航&#xff0c;一个正在变秃、变强的文艺倾年。 &#x1f514;本文讲解24考研860软件工程佛系上岸经验分享【丰富简历、初复试攻略、导师志愿、资料汇总】&#xff0c;期待与你一同探索、学习、进步&#xff0c;一起卷起来叭&#xff01; 目…

动态多目标优化:进化动态约束多目标优化测试集DCP1-DCP9的TruePF(提供MATLAB代码)

一、Evolutionary Dynamic Constrained Multiobjective Optimization Test Suite 以最小化为例,带约束的动态多目标优化问题&#xff08;Evolutionary Dynamic Constrained Multiobjective Optimization &#xff09;的数学描述如下: min ⁡ x ∈ S ( t ) ⊂ R n f ( x , t ) …

腾讯云4核8G服务器性能怎么样?能用来干什么?

腾讯云4核8G服务器多少钱&#xff1f;腾讯云4核8G轻量应用服务器12M带宽租用价格646元15个月&#xff0c;活动页面 txybk.com/go/txy 活动链接打开如下图所示&#xff1a; 腾讯云4核8G服务器优惠价格 这台4核8G服务器是轻量应用服务器&#xff0c;详细配置为&#xff1a;轻量4核…

【Linux】vim 编辑器

Linux 系统自带了 gedit 和 vi 编辑器&#xff0c;gedit 是图形化界面的操作&#xff0c;而 vi 由比较难用&#xff0c;所以建议安装 vim 编辑器&#xff0c;vim 是从 vi 发展出来的一个文本编辑器&#xff0c;相当于增强版的 vi &#xff0c;其代码补完、编译及错误跳转等功能…

python-django物流仓储进销存配送管理系统flask_1ea2k

实现了一个完整的物流管理系统&#xff0c;其中主要有站点信息模块、物流进度模块、用户表模块、司机模块、入库信息模块、签收信息模块、类型模块、快递信息模块、客户模块、客服模块、公告信息模块、服务类型模块、配置文件模块、出库信息模块、车辆信息模块、仓管模块、账户…

【蓝桥杯选拔赛真题55】C++最长路线 第十四届蓝桥杯青少年创意编程大赛 算法思维 C++编程选拔赛真题解

目录 C最长路线 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 七、推荐资料 C最长路线 第十四届蓝桥杯青少年创意编程大赛C选拔赛真题 一、题目要求 1、编程实现 有一个N*M的矩阵&#xff0c;且矩阵…

【Java基础】Java基础知识整合

文章目录 1. 转义字符2. 变量2.1 字符串与整型相加2.2 byte和short的区别2.3 float和double的区别2.4 char类型2.5 boolean类型2.6 自动类型转换及运算2.7 强制类型转换2.8 String的转换2.9 除法运算2.10 取模规则 3. 自增4. 逻辑运算符5. 赋值运算 6. 三元运算符&#xff1a;7…