题目描述

小明冒充X星球的骑士,进入了一个奇怪的城堡。

城堡里边什么都没有,只有方形石头铺成的地面。

假设城堡地面是 n x n 个方格。【如图1.png】所示。

按习俗,骑士要从西北角走到东南角。
可以横向或纵向移动,但不能斜着走,也不能跳跃。
每走到一个新方格,就要向正北方和正西方各射一箭。
(城堡的西墙和北墙内各有 n 个靶子)

同一个方格只允许经过一次。但不必走完所有的方格。

如果只给出靶子上箭的数目,你能推断出骑士的行走路线吗?

有时是可以的,比如图1.png中的例子。

本题的要求就是已知箭靶数字,求骑士的行走路径(测试数据保证路径唯一)

输入
第一行一个整数N(0<N<20),表示地面有 N x N 个方格
第二行N个整数,空格分开,表示北边的箭靶上的数字(自西向东)
第三行N个整数,空格分开,表示西边的箭靶上的数字(自北向南)

输出
一行若干个整数,表示骑士路径。

为了方便表示,我们约定每个小格子用一个数字代表,从西北角开始编号: 0,1,2,3…
比如,图1.png中的方块编号为:

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>
using namespace std;
int n;
int a[20], b[20];//a数组为自西向东的靶数,b数组为自北向南的靶数
int arr[20][20];//格子标记,按题目要求,0,1,2,3,4,...,n-1
int vis[20][20] = { 0 };//标记该点是否被走过
int top;//栈顶
int stack[20];//调用栈,存储路径,即答案
int dx[4] = { 1,0,-1,0 };//方向坐标,对应下左上右(见上图)
int dy[4] = { 0,-1,0,1 };//方向坐标,对应下左上右
bool check()//检查靶子上的靶数是否为0,因为采用的减法,所以为0,说明路径正确,否则说明路径不正确
{for (int i = 0; i < n; i++){if (a[i] != 0 || b[i] != 0)return false;}return true;
}
void dfs(int x, int y, int step)
{if (a[y] < 0 || b[x] < 0)//剪枝  如果要射的箭数小于0了,那么就说明多射了一箭,再继续走下去就不可能符合题目的要求了return;if (x == n - 1 && y == n - 1)//终止条件,到达最后一个格子,坐标为(n-1,n-1){if (check())//靶数对应正确,则输出,否则继续递归{for (int i = 0; i < top; i++)cout << stack[i] << " ";cout << endl;}return;}for (int i = 0; i < 4; i++)//下一步往哪个方向走(共4个方向){int tx, ty;//下一点的坐标tx = x + dx[i];ty = y + dy[i];if (vis[tx][ty] == 0 && tx >= 0 && tx < n && ty >= 0 && ty < n)//未被访问,且未超出格子{vis[tx][ty] = 1;//标记为访问stack[top++] = arr[tx][ty];//格子对应标记入栈a[ty]--;//靶数对应减1b[tx]--;dfs(tx, ty, step+1);//从当前坐标继续向后走(递归调用)a[ty]++;//回溯(靶数对应加1)b[tx]++;top--;//出栈vis[tx][ty] = 0;//标记为未访问}}
}
int main()
{cin >> n;for (int i = 0; i < n; i++)//输入靶数cin >> a[i];for (int i = 0; i < n; i++)cin >> b[i];for (int i = 0,k=0; i < n; i++)//初始化格子标记0,1,2,3,4,...,n-1for (int j = 0; j < n; j++)arr[i][j] = k++;//从第一个格子开始,将第一个格子做一些初始化vis[0][0] = 1;//标记为访问stack[0] = a[0][0];//入栈top = 1;//栈内元素个数为1a[0]--;//对应靶数减1b[0]--;dfs(0, 0, 1);//从坐标(0,0)开始向后走return 0;
}

蓝桥杯2016年第七届真题-路径之谜相关推荐

  1. [蓝桥杯][2016年第七届真题]压缩变换(主席树求区间不同数的个数)

    题目描述 小明最近在研究压缩算法. 他知道,压缩的时候如果能够使得数值很小,就能通过熵编码得到较高的压缩比. 然而,要使数值很小是一个挑战. 最近,小明需要压缩一些正整数的序列,这些序列的特点是,后面 ...

  2. [蓝桥杯][2016年第七届真题]冰雹数(暴力打表找规律)

    题目描述 任意给定一个正整数N, 如果是偶数,执行: N / 2 如果是奇数,执行: N * 3 + 1 生成的新的数字再执行同样的动作,循环往复. 通过观察发现,这个数字会一会儿上升到很高, 一会儿 ...

  3. [蓝桥杯][2016年第七届真题]密码脱落(记忆化搜索)

    题目描述 X星球的考古学家发现了一批古代留下来的密码. 这些密码是由A.B.C.D 四种植物的种子串成的序列. 仔细分析发现,这些密码串当初应该是前后对称的(也就是我们说的镜像串). 由于年代久远,其 ...

  4. 蓝桥杯2016年第七届真题——四平方和

    四平方和 一.题目内容 题目描述 四平方和定理,又称为拉格朗日定理:每个正整数都可以表示为至多4个正整数的平方和,如果把0包括进去,就正好可以表示为4个数的平方和.比如:5 = 0^2 + 0^2 + ...

  5. 问题 1825: [蓝桥杯][2015年第六届真题]穿越雷区

    问题 1825: [蓝桥杯][2015年第六届真题]穿越雷区 时间限制: 1Sec 内存限制: 128MB 提交: 310 解决: 211 题目描述 X星的坦克战车很奇怪,它必须交替地穿越正能量辐射区 ...

  6. [蓝桥杯][2019年第十届真题]扫地机器人(二分+贪心)

    题目描述 小明公司的办公区有一条长长的走廊,由 N 个方格区域组成,如下图所 示. 走廊内部署了 K 台扫地机器人,其中第 i 台在第 Ai 个方格区域中. 已知扫地机器人每分钟可以移动到左右相邻的方 ...

  7. [蓝桥杯][2015年第六届真题]生命之树(树形dp)

    题目描述 在X森林里,上帝创建了生命之树. 他给每棵树的每个节点(叶子也称为一个节点)上,都标了一个整数,代表这个点的和谐值. 上帝要在这棵树内选出一个非空节点集S,使得对于S中的任意两个点a,b,都 ...

  8. [蓝桥杯][2015年第六届真题]密文搜索(排序+二分)

    题目描述 福尔摩斯从X星收到一份资料,全部是小写字母组成. 他的助手提供了另一份资料:许多长度为8的密码列表. 福尔摩斯发现,这些密码是被打乱后隐藏在先前那份资料中的. 请你编写一个程序,从第一份资料 ...

  9. [蓝桥杯][2019年第十届真题]糖果(状压dp)

    题目描述 糖果店的老板一共有 M 种口味的糖果出售.为了方便描述,我们将 M 种 口味编号 1 ∼ M. 小明希望能品尝到所有口味的糖果.遗憾的是老板并不单独出售糖果,而 是 K 颗一包整包出售. 幸 ...

最新文章

  1. 转载sunboy_2050 - Android APK反编译详解(附图)
  2. (转载)Linux信息资源
  3. mysql 导入导出 优化_mysql数据导入导出与数据表优化
  4. Windows XP环境下Apache2.2.21和Tomcat7.0.26下的整合
  5. backbone.js全栈开发
  6. display:inline、block、inline-block的区别以及该死的ie6兼容问题
  7. js 获得明天0点时间戳_Python 3+Django 3 结合Vue.js框架构建前后端分离Web开发平台实战...
  8. 玩转Linux系统用户管理
  9. python-使用字典使Fibonacci更有效率
  10. ARCHLINX设置静态ip使用
  11. 【数据库原理实验(openGauss)】数据库的备份与恢复
  12. pytorch RNN原理实现词性判别以及预测下一个词
  13. GB28181国标错误码
  14. MICROSOFT REPORTVIEWER(微软报表)项目中的应用
  15. 斗地主牌型判断实现(一)
  16. PICkits3调试功能
  17. 厦门龙凤419_福建生物工程职业技术学校2019招生通知书EMS单号
  18. 2020 博客之星评选【票数排行榜】每日更新
  19. Nav2极简笔记03-启动文件launch
  20. 电脑硬件相关简单知识

热门文章

  1. 关于OGRE与OSG的简单比较
  2. ―挑战你的极限―(短篇医院感人鬼故事两则)
  3. 看懂这些故事 你做人就很成功了
  4. CSS特效十:信息提示框
  5. MATLAB改变默认工作路径
  6. 9.2 达摩克利斯剑:51%攻击
  7. 虚拟机Ubuntu18.04 使用usb_cam调用笔记本摄像头
  8. 苹果10月30日发布会有什么?看这就知道了
  9. python把视频取帧_用Python提取视频帧
  10. WordPress显示昵称作为评论作者的名字 最新优化版代码