[蓝桥杯2016决赛]路径之谜

题目描述

小明冒充X星球的骑士,进入了一个奇怪的城堡。城堡里边什么都没有,只有方形石头铺成的地面。
假设城堡地面是 n x n 个方格。
按习俗,骑士要从西北角走到东南角。可以横向或纵向移动,但不能斜着走,也不能跳跃。
每走到一个新方格,就要向正北方和正西方各射一箭。(城堡的西墙和北墙内各有 n 个靶子)
同一个方格只允许经过一次。但不必走完所有的方格。
如果只给出靶子上箭的数目,你能推断出骑士的行走路线吗?
有时是可以的,比如图中的例子。
本题的要求就是已知箭靶数字,求骑士的行走路径(测试数据保证路径唯一)
在这里插入图片描述

输入
第一行一个整数N(0<N<20),表示地面有 N x N 个方格
第二行N个整数,空格分开,表示北边的箭靶上的数字(自西向东)
第三行N个整数,空格分开,表示西边的箭靶上的数字(自北向南)
输出
一行若干个整数,表示骑士路径
为了方便表示,我们约定每个小格子用一个数字代表,从西北角开始编号: 0,1,2,3…
比如,上图中的方块编号为:
0 1 2 3
4 5 6 7
8 9 10 11
12 13 14 15
样例输入
4
2 4 3 4
4 3 3 3
样例输出
0 4 5 1 2 3 7 11 10 9 13 14 15

代码如下:

#include <iostream>
#include <cstring>
using namespace std;
int dx[] = {0,0,1,-1},dy[] = {1,-1,0,0};//方向向量
const int N = 21;
int mp[N][N];//存储地图编号
bool st[N][N];//标记地图某格是否走过或者能不能走
int path[410];//存储路径,这个数组要开大一点,它搜索的时候可能有一次搜索会把全部格子都走了
int n;
int flagx[N],flagy[N];//每走一格射的靶子,用来判断与题目输入的靶子是否相同
int tarx[N],tary[N];//题目输入的靶子数目
int flagxs,flagys;
void PrintPath(int index)//输出结果函数,也可以加入dfs中,就是加进去的话代码比较丑
{for (int i = 1;i<=index;i++){cout<<path[i]<<" ";}cout<<endl;
}void dfs(int x,int y,int index)//搜索路径
{if (x==n && y==n)//判断是否到达终点{for (int i = 1;i<=n;i++){if (flagx[i]==tarx[i]) flagxs++;if (flagy[i]==tary[i]) flagys++;}if (flagxs==n && flagys==n)//判断到达终点后靶子数目是否相同{PrintPath(index);return ;}else{flagxs = 0;flagys = 0;return;}}for (int i = 0;i<4;i++){int xx = x+dx[i],yy = y+dy[i];if (st[xx][yy]) continue;flagx[xx]++;flagy[yy]++;path[index+1] = mp[xx][yy];st[xx][yy] = true;dfs(xx,yy,index+1);st[xx][yy] = false;flagx[xx]--;flagy[yy]--;}
}int main()
{cin>>n;for (int i = 1;i<=n;i++) cin>>tary[i];for (int i = 1;i<=n;i++) cin>>tarx[i];memset(st,1,sizeof(st));int k = 0;for (int i = 1;i<=n;i++)for (int j = 1;j<=n;j++){mp[i][j] = k++;st[i][j] = false;}st[1][1] = true;//标记起点flagx[1] = 1;flagy[1] = 1;path[1] = 0;dfs(1,1,1);return 0;
}

可惜这样暴搜超时了,无法AC,我们要想办法剪枝。

剪枝优化AC代码如下:

#include <iostream>
#include <cstring>
using namespace std;int dx[] = {0, 0, 1, -1}, dy[] = {1, -1, 0, 0};
const int N = 21;
int mp[N][N];
bool st[N][N];
int tarx[N], tary[N];
int n;
int sum;//这条路线的总步数
int path[410];void PrintPath(int index) {for (int i = 1; i <= index; i++) {cout << path[i] << " ";}cout << endl;
}void dfs(int x, int y, int index) {if (index > sum)//当它搜索的时候超过总步数(多走了),就说明肯定不是走这条路,所以重新选路return;for (int i = 1; i <= n; i++) {if (tarx[i] < 0 || tary[i] < 0)//当有靶子减没了,也肯定是走错路了return;}if (x == n && y == n && sum == index) {//只有刚好到终点,且走的步数与总步数相等,就说明是这条路了PrintPath(index);return ;}for (int i = 0; i < 4; i++) {int xx = x + dx[i], yy = y + dy[i];if (st[xx][yy])continue;tary[yy]--;tarx[xx]--;st[xx][yy] = true;//记得标记path[index + 1] = mp[xx][yy];dfs(xx, yy, index + 1);st[xx][yy] = false;//要记得"还原现场"tary[yy]++;tarx[xx]++;}}int main() {cin >> n;for (int i = 1; i <= n; i++) {cin >> tary[i];sum += tary[i];}for (int i = 1; i <= n; i++)cin >> tarx[i];memset(st, 1, sizeof(st));int k = 0;for (int i = 1; i <= n; i++)for (int j = 1; j <= n; j++) {mp[i][j] = k++;st[i][j] = false;}st[1][1] = true;tary[1]--;//注意,刚开始要把(1,1)位置的靶子先减掉tarx[1]--;path[1] = 0;dfs(1, 1, 1);return 0;
}

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

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

相关文章

数据结构---二叉平衡排序树的删除

数据结构—二叉平衡排序树的删除 原理&#xff1a;参考趣学数据结构 代码&#xff1a; #include<stdio.h> #include<stdlib.h> typedef struct avlTree {int data;struct avlTree *lchild, *rchild;int height; }avlTree;int height(avlTree* AVLTree);//声明av…

Magicodes.IE 2.0发布

Magicodes.IE是我们维护的开源的导入导出通用库&#xff0c;去年年底已加入NCC开源组织。Github地址&#xff1a;https://github.com/xin-lai/Magicodes.IEMagicodes.IE不是一蹴而就&#xff0c;而是根据实际需求不断迭代出来的&#xff0c;而且历经多次重构。这一次&#xff0…

python百分号用法_python百分号%—%s、%d、%f

百分号%表示占位符&#xff0c;在后续通过%传入真实的值 %s 拼接字符串&#xff0c;实际可以接受任何类型的值 %d 只能拼接整数数字 %.nf 四舍五入拼接浮点数&#xff0c;n表示保留到小数点后n位&#xff0c;不加.n默认保留6位小数 %% 在有%拼接的的字符串里&#xff0c;如果要…

《ASP.NET Core 微服务实战》-- 读书笔记(第11章)

第 11 章 开发实时应用和服务在本章&#xff0c;我们将讨论“实时”的准确含义&#xff0c;以及在大部分消费者看来应该属于这一范畴的应用类型接着&#xff0c;我们将探讨 WebSocket&#xff0c;并分析为什么传统的 WebSocket 与云环境完全不相适应&#xff0c;最后我们将构建…

word List 14

word List 14 如果存在什么问题&#xff0c;欢迎批评指正&#xff01;谢谢&#xff01;

python编程模式是什么_python 开发的三种运行模式详细介绍

Python 三种运行模式 Python作为一门脚本语言&#xff0c;使用的范围很广。有的同学用来算法开发&#xff0c;有的用来验证逻辑&#xff0c;还有的作为胶水语言&#xff0c;用它来粘合整个系统的流程。不管怎么说&#xff0c;怎么使用python既取决于你自己的业务场景&#xff0…

递归实现排列型枚举

把 1∼n 这 n 个整数排成一行后随机打乱顺序&#xff0c;输出所有可能的次序。 输入格式 一个整数 n。 输出格式 按照从小到大的顺序输出所有方案&#xff0c;每行 1 个。 首先&#xff0c;同一行相邻两个数用一个空格隔开。 其次&#xff0c;对于两个不同的行&#xff0c;…

【在路上5】实时计算助力派件管控

签收率系统试运营以来&#xff0c;每天算出高额罚款&#xff0c;虽然没有真正执行&#xff0c;但也挺吓人的。并且&#xff0c;完完全全的把全网人员积极性提升起来了。总部网络管理中心每天给出各省区前一天的签收率报表&#xff0c;来了个排名和点名&#xff1b;各省区管理中…

数据结构---B-(B)、B+的总结

数据结构—B-&#xff08;B&#xff09;、B的总结 原理&#xff1a;参考趣学数据结构 m阶B-树规则(有序的&#xff08;左子树的元素值<根节点的元素值<右子树的元素值&#xff09;、平衡的&#xff08;每个结点的左右子树的高度差<1&#xff09;、多路的&#xff08…

dfs巩固训练

按顺序从上往下刷即可&#xff01;&#xff01;&#xff01; 知识点: 关于环形的数组&#xff0c;前移动和后移动可能会溢出下标。解决方法是&#xff0c;转移后的坐标公式为 &#xff08;原坐标改变量数组长度&#xff09;%数组长度 易错点: 写搜索时候&#xff0c;有时候会…

python适用范围_Python应用范围总结概览

Python就是万金油&#xff01; Python&#xff08;派森&#xff09;&#xff0c;它是一个简单的、解释型的、交互式的、可移植的、面向对象的超高级语言。这就是对Python语言的最简单的描述。 Python有一个交互式的开发环境&#xff0c;因为Python是解释运行&#xff0c;这大大…

重磅!K8S 1.18版本将内置支持SideCar容器。

作者&#xff1a;justmine头条号&#xff1a;大数据与云原生微信公众号&#xff1a;大数据与云原生创作不易&#xff0c;在满足创作共用版权协议的基础上可以转载&#xff0c;但请以超链接形式注明出处。为了方便阅读&#xff0c;微信公众号已按分类排版&#xff0c;后续的文章…

广义表的学习(原理和代码)

广义表的学习&#xff08;原理和代码&#xff09; 参考链接&#xff1a; https://blog.csdn.net/it_is_me_a/article/details/99870530

bfs巩固训练

按顺序从上往下刷即可&#xff01;&#xff01;&#xff01; 知识点: 关于环形的数组&#xff0c;前移动和后移动可能会溢出下标。解决方法是&#xff0c;转移后的坐标公式为 &#xff08;原坐标改变量数组长度&#xff09;%数组长度 易错点: 写搜索时候&#xff0c;有时候会…

python输出文本 去掉引号_Python可以在文本文件中读取时从字符串中删除双引号吗?...

我有一些这样的文本文件&#xff0c;有50​​00行&#xff1a; 5.6 4.5 6.8 "6.5" (new line) 5.4 8.3 1.2 "9.3" (new line) 所以最后一个术语是双引号之间的数字。 我想做的是使用Python(如果可能的话)将四列分配给双变量。但主要的问题是最后一个术语&a…

word List 15

word List 15 如果存在什么问题&#xff0c;欢迎批评指正&#xff01;谢谢&#xff01;

.NET Core 如何验证信用卡卡号

_点击上方蓝字关注“汪宇杰博客”导语最近在家闲的蛋疼需要写点文章。正好我本人在金融科技公司工作&#xff0c;对信用卡业务略有了解。我们看看如何在 .NET Core 里验证一个信用卡的卡号是否合法。信用卡卡号组成首先&#xff0c;信用卡的卡号一般为16位&#xff0c;也有少许…

python统计文件中每个单词出现的次数_python统计文本中每个单词出现的次数

.python统计文本中每个单词出现的次数&#xff1a; #codingutf-8 __author__ ‘zcg‘ import collections import os with open(‘abc.txt‘) as file1:#打开文本文件 str1file1.read().split(‘ ‘)#将文章按照空格划分开 print "原文本:\n %s"% str1 print "…

AcWing 1101. 献给阿尔吉侬的花束

阿尔吉侬是一只聪明又慵懒的小白鼠&#xff0c;它最擅长的就是走各种各样的迷宫。 今天它要挑战一个非常大的迷宫&#xff0c;研究员们为了鼓励阿尔吉侬尽快到达终点&#xff0c;就在终点放了一块阿尔吉侬最喜欢的奶酪。 现在研究员们想知道&#xff0c;如果阿尔吉侬足够聪明…

数据结构---关键路径

数据结构—关键路径 原理&#xff1a;参考趣学数据结构 代码&#xff1a; #include<stdio.h> #include<stdlib.h> #include "stack.h" #define typeNode int //每个头结点的标识数据类型 #define N 100 //最大结点数 int degree[N];//结点入度数,通过…