题意:

小明冒充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

分析:不确定是否正确,如果有错,欢迎指明~

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int MAXN = 20 + 10;
  4. int north[MAXN], west[MAXN];
  5. int pic[MAXN][MAXN];
  6. bool vis[MAXN][MAXN];//方格是否走过
  7. int ans[10010];
  8. int dr[] = {1, -1, 0, 0};
  9. int dc[] = {0, 0, 1, -1};
  10. int N;
  11. bool judge(int x, int y){
  12. return x >= 0 && x < N && y >= 0 && y < N;
  13. }
  14. bool ok;
  15. bool j(){
  16. for(int i = 0; i < N; ++i){
  17. if(north[i] != 0 || west[i] != 0) return false;
  18. }
  19. return true;
  20. }
  21. int num;
  22. void dfs(int x, int y, int cnt){
  23. if(ok) return;
  24. ans[cnt] = pic[x][y];
  25. if(pic[x][y] == N * N - 1){
  26. if(j()){
  27. num = cnt;
  28. ok = true;
  29. }
  30. return;
  31. }
  32. for(int i = 0; i < 4; ++i){
  33. int tmpx = x + dr[i];
  34. int tmpy = y + dc[i];
  35. if(judge(tmpx, tmpy) && !vis[tmpx][tmpy]){
  36. if(!north[tmpy] || !west[tmpx]) continue;
  37. vis[tmpx][tmpy] = true;
  38. --north[tmpy];
  39. --west[tmpx];
  40. dfs(tmpx, tmpy, cnt + 1);
  41. if(ok) return;
  42. ++north[tmpy];
  43. ++west[tmpx];
  44. vis[tmpx][tmpy] = false;
  45. }
  46. }
  47. }
  48. int main(){
  49. scanf("%d", &N);
  50. for(int i = 0; i < N; ++i){
  51. scanf("%d", &north[i]);
  52. }
  53. for(int i = 0; i < N; ++i){
  54. scanf("%d", &west[i]);
  55. }
  56. int k = 0;
  57. for(int i = 0; i < N; ++i){
  58. for(int j = 0; j < N; ++j){
  59. pic[i][j] = k++;
  60. }
  61. }
  62. --north[0];
  63. --west[0];
  64. ok = false;
  65. dfs(0, 0, 0);
  66. for(int i = 0; i <= num; ++i){
  67. if(i) printf(" ");
  68. printf("%d", ans[i]);
  69. }
  70. printf("\n");
  71. return 0;
  72. }

  

2016蓝桥杯决赛C/C++A组第四题 路径之谜的更多相关文章

  1. 2016蓝桥杯决赛C/C++A组第三题 打靶

    题意: 小明参加X星球的打靶比赛.比赛使用电子感应计分系统.其中有一局,小明得了96分. 这局小明共打了6发子弹,没有脱靶.但望远镜看过去,只有3个弹孔.显然,有些子弹准确地穿过了前边的弹孔. 不同环 ...

  2. 关于2018年第九届蓝桥杯[C++省赛B组][第四题:测试次数]的疑问

    题目来源:https://blog.csdn.net/qq_34202873/article/details/79784548 #标题:测试次数#x星球的居民脾气不太好,但好在他们生气的时候唯一的异常 ...

  3. 2013第四届蓝桥杯决赛Java高职高专组题目以及解法答案

    2013第四届蓝桥杯决赛Java高职高专组题目以及解法答案 不知不觉离决赛都过去一个月了,一直忙于各种事情,都忘记整理一份试题.当作回忆也好. 1. 标题:好好学习 汤姆跟爷爷来中国旅游.一天,他帮助 ...

  4. 2018第九届蓝桥杯决赛(C++ B组)

    逛了大半个北京还是挺好玩de 第一题 标题:换零钞 x星球的钞票的面额只有:100元,5元,2元,1元,共4种. 小明去x星旅游,他手里只有2张100元的x星币,太不方便,恰好路过x星银行就去换零钱. ...

  5. 2017第八届蓝桥杯决赛(C++ B组)4.发现环

    描述 小明的实验室有N台电脑,编号1~N.原本这N台电脑之间有N-1条数据链接相连,恰好构成一个树形网络.在树形网络上,任意两台电脑之间有唯一的路径相连. 不过在最近一次维护网络时,管理员误操作使得某 ...

  6. 2017第八届蓝桥杯决赛(C++ B组)2.磁砖样式

    磁砖样式 小明家的一面装饰墙原来是 310 的小方格. 现在手头有一批刚好能盖住2个小方格的长方形瓷砖. 瓷砖只有两种颜色:黄色和橙色. 小明想知道,对于这么简陋的原料,可以贴出多少种不同的花样来. ...

  7. 第八届蓝桥杯国赛java B组第三题

    标题:树形显示 对于分类结构可以用树形来形象地表示.比如:文件系统就是典型的例子. 树中的结点具有父子关系.我们在显示的时候,把子项向右缩进(用空格,不是tab),并添加必要的连接线,以使其层次关系更 ...

  8. 蓝桥杯——剪邮票(2016JavaB组第10题)

    剪邮票(16JavaB10) 如[图1], 有12张连在一起的12生肖的邮票. 现在你要从中剪下5张来,要求必须是连着的. (仅仅连接一个角不算相连) 比如,[图2],[图3]中,粉红色所示部分就是合 ...

  9. 蓝桥杯——压缩变换(2016JavaB组第9题)

    压缩变换(16JavaB9) 小明最近在研究压缩算法. 他知道,压缩的时候如果能够使得数值很小,就能通过熵编码得到较高的压缩比. 然而,要使数值很小是一个挑战. 最近,小明需要压缩一些正整数的序列,这 ...

随机推荐

  1. bitcoin01

    bitcoin, blockchain 本文只是初步表面认识比特币的笔记... 详细信息请看相关链接. 比特币除了耗电,耗硬盘存储空间,还有无法预测,无法控制的风险. 1. Satoshi_Nakam ...

  2. AngularJS1.X指令

    <!DOCTYPE html> <html ng-app='myApp'> <head> <meta charset="utf-8"> ...

  3. 阿里云配置mysql

    环境:阿里云ECS服务器,系统为centos7.2 用户:root 参考博客:https://blog.csdn.net/kunzai6/article/details/81938613 师兄的哈哈哈 ...

  4. Maven项目- "null" 的java.lang.reflect.InvocationTargetException 解决方法

    异常显示: 解决方法:

  5. javascript中,对象本身就是一种Map结构。

    var map = {}; map['key1'] = 1; map['key2@'] = 2;   console.log(map['key1']);//结果是1. console.log(map[ ...

  6. 获取JSHANDLE句柄

    A string can also be passed in instead of a function: const aHandle = await page.evaluateHandle('doc ...

  7. LeetCode347:返回频率前K高的元素,基于优先队列实现

    package com.lt.datastructure.MaxHeap; import java.util.LinkedList; import java.util.List; import jav ...

  8. java有参

    一.带参数的方法 语法: 访问修饰符  方法返回值类型   方法名称 (参数列表){ // 方法体 注意:每个参数之间用","分割 二.形参和实参 形参:在方法定义时指定的参数 实 ...

  9. Maven添加Tomcat插件实现热部署

    Maven热部署,顾名思义就是可以不影响项目在服务器中的运行情况,可以实现项目代码的更新,减少启动,编译时间,达到快速开发的目的,也不需要手动拷贝war包到远程项目,可以直接将项目以及war包部署到远 ...

  10. other#docker

    阿里云docker镜像加速地址:https://cr.console.aliyun.com/#/accelerator docker 安装: yum install -y yum-utils devi ...