openjudge_2.5基本算法之搜索_8465:马走日

2024-06-22 14:12

本文主要是介绍openjudge_2.5基本算法之搜索_8465:马走日,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目

8465:马走日
总时间限制: 1000ms 内存限制: 65536kB
描述
马在中国象棋以日字形规则移动。

请编写一段程序,给定n*m大小的棋盘,以及马的初始位置(x,y),要求不能重复经过棋盘上的同一个点,计算马可以有多少途径遍历棋盘上的所有点。

输入
第一行为整数T(T < 10),表示测试数据组数。
每一组测试数据包含一行,为四个整数,分别为棋盘的大小以及初始位置坐标n,m,x,y。(0<=x<=n-1,0<=y<=m-1, m < 10, n < 10)
输出
每组测试数据包含一行,为一个整数,表示马能遍历棋盘的途径总数,0为无法遍历一次。
样例输入
1
5 4 0 0
样例输出
32

理解

  1. 看到题目后,甚至在思考马走完该地图的所有路线和路线的重复问题。后来再仔细看题,才意识到问题是从某点出发有几个线路。这里再次强调审题的重要性。
  2. 某点出发后走遍全图就是wh个位置,wh次步数(第一步是1),是判断完成依据。
  3. 深搜可以解决问题,记住每步的步数,同时作为该线路时的标记,用回溯探索所有线路。很多线路达不到目的。

代码

#include <bits/stdc++.h>
using namespace std;
struct point{
int x,y,k,step;
void setn(int sx,int sy){
x=sx,y=sy,step=0;
}
}p[15][15];
int n,h,w,sx,sy,ans,m,
d[8][2]={{-1,-2},{-2,-1},{-2,1},{-1,2},{1,2},{2,1},{2,-1},{1,-2}};
void view(int sx,int sy){
cout<<“地图”<<sx<<“,”<<sy<<endl;
cout<<“\t”;for(int j=1;j<=w;j++)cout<<j<<“列\t”;cout<<endl;
for(int i=1;i<=h;i++){
cout<<i<<“行\t”;
for(int j=1;j<=w;j++)cout<<p[i][j].step<<“\t”;
cout<<endl;
}
}
void go(int sx,int sy){
//view(sx,sy);
if(p[sx][sy].step==h*w){
//cout<<“got it!”<<endl;
ans++;
//view(sx,sy);
return;
}
int x,y;
for(int i=0;i<8;i++){
x=sx+d[i][0],y=sy+d[i][1];
if(x<1||x>h||y<1||y>w||p[x][y].step)continue;
p[x][y].step=p[sx][sy].step+1;
go(x,y);
p[x][y].step=0;
}
}
void pclear(){
for(int i=1;i<=h;i++)for(int j=1;j<=w;j++)p[i][j].setn(i,j);
}
int main(){
//freopen(“data.cpp”,“r”,stdin);
cin>>n;
while(n–){
cin>>w>>h>>sy>>sx;
ans=0;
pclear();
p[sx+1][sy+1].step=1;
go(sx+1,sy+1);
cout<<ans<<endl;
}
return 0;
}

技术细节

  1. 多组数据,要初始化
  2. 探测所有线路,要回溯
  3. 注意输入数据“棋盘的大小以及初始位置坐标n,m,x,y”,根据x,y可以判定是列和行,所有n,m是宽和高。而且是从零开始,判定结果需要(x行+1)*w+y列。

这篇关于openjudge_2.5基本算法之搜索_8465:马走日的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1084516

相关文章

MySQL中between and的基本用法、范围查询示例详解

《MySQL中betweenand的基本用法、范围查询示例详解》BETWEENAND操作符在MySQL中用于选择在两个值之间的数据,包括边界值,它支持数值和日期类型,示例展示了如何使用BETWEEN... 目录一、between and语法二、使用示例2.1、betwphpeen and数值查询2.2、be

MySQL基本表查询操作汇总之单表查询+多表操作大全

《MySQL基本表查询操作汇总之单表查询+多表操作大全》本文全面介绍了MySQL单表查询与多表操作的关键技术,包括基本语法、高级查询、表别名使用、多表连接及子查询等,并提供了丰富的实例,感兴趣的朋友跟... 目录一、单表查询整合(一)通用模版展示(二)举例说明(三)注意事项(四)Mapper简单举例简单查询

Redis 基本数据类型和使用详解

《Redis基本数据类型和使用详解》String是Redis最基本的数据类型,一个键对应一个值,它的功能十分强大,可以存储字符串、整数、浮点数等多种数据格式,本文给大家介绍Redis基本数据类型和... 目录一、Redis 入门介绍二、Redis 的五大基本数据类型2.1 String 类型2.2 Hash

深入理解Mysql OnlineDDL的算法

《深入理解MysqlOnlineDDL的算法》本文主要介绍了讲解MysqlOnlineDDL的算法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小... 目录一、Online DDL 是什么?二、Online DDL 的三种主要算法2.1COPY(复制法)

Java Instrumentation从概念到基本用法详解

《JavaInstrumentation从概念到基本用法详解》JavaInstrumentation是java.lang.instrument包提供的API,允许开发者在类被JVM加载时对其进行修改... 目录一、什么是 Java Instrumentation主要用途二、核心概念1. Java Agent

Kotlin 协程之Channel的概念和基本使用详解

《Kotlin协程之Channel的概念和基本使用详解》文章介绍协程在复杂场景中使用Channel进行数据传递与控制,涵盖创建参数、缓冲策略、操作方式及异常处理,适用于持续数据流、多协程协作等,需注... 目录前言launch / async 适合的场景Channel 的概念和基本使用概念Channel 的

Python函数的基本用法、返回值特性、全局变量修改及异常处理技巧

《Python函数的基本用法、返回值特性、全局变量修改及异常处理技巧》本文将通过实际代码示例,深入讲解Python函数的基本用法、返回值特性、全局变量修改以及异常处理技巧,感兴趣的朋友跟随小编一起看看... 目录一、python函数定义与调用1.1 基本函数定义1.2 函数调用二、函数返回值详解2.1 有返

Python ORM神器之SQLAlchemy基本使用完全指南

《PythonORM神器之SQLAlchemy基本使用完全指南》SQLAlchemy是Python主流ORM框架,通过对象化方式简化数据库操作,支持多数据库,提供引擎、会话、模型等核心组件,实现事务... 目录一、什么是SQLAlchemy?二、安装SQLAlchemy三、核心概念1. Engine(引擎)

Python异步编程之await与asyncio基本用法详解

《Python异步编程之await与asyncio基本用法详解》在Python中,await和asyncio是异步编程的核心工具,用于高效处理I/O密集型任务(如网络请求、文件读写、数据库操作等),接... 目录一、核心概念二、使用场景三、基本用法1. 定义协程2. 运行协程3. 并发执行多个任务四、关键

Go语言连接MySQL数据库执行基本的增删改查

《Go语言连接MySQL数据库执行基本的增删改查》在后端开发中,MySQL是最常用的关系型数据库之一,本文主要为大家详细介绍了如何使用Go连接MySQL数据库并执行基本的增删改查吧... 目录Go语言连接mysql数据库准备工作安装 MySQL 驱动代码实现运行结果注意事项Go语言执行基本的增删改查准备工作