2016蓝桥杯决赛C/C++A组第四题 路径之谜
题意:
小明冒充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<bits/stdc++.h>
using namespace std;
const int MAXN = 20 + 10;
int north[MAXN], west[MAXN];
int pic[MAXN][MAXN];
bool vis[MAXN][MAXN];//方格是否走过
int ans[10010];
int dr[] = {1, -1, 0, 0};
int dc[] = {0, 0, 1, -1};
int N;
bool judge(int x, int y){
return x >= 0 && x < N && y >= 0 && y < N;
}
bool ok;
bool j(){
for(int i = 0; i < N; ++i){
if(north[i] != 0 || west[i] != 0) return false;
}
return true;
}
int num;
void dfs(int x, int y, int cnt){
if(ok) return;
ans[cnt] = pic[x][y];
if(pic[x][y] == N * N - 1){
if(j()){
num = cnt;
ok = true;
}
return;
}
for(int i = 0; i < 4; ++i){
int tmpx = x + dr[i];
int tmpy = y + dc[i];
if(judge(tmpx, tmpy) && !vis[tmpx][tmpy]){
if(!north[tmpy] || !west[tmpx]) continue;
vis[tmpx][tmpy] = true;
--north[tmpy];
--west[tmpx];
dfs(tmpx, tmpy, cnt + 1);
if(ok) return;
++north[tmpy];
++west[tmpx];
vis[tmpx][tmpy] = false;
}
}
}
int main(){
scanf("%d", &N);
for(int i = 0; i < N; ++i){
scanf("%d", &north[i]);
}
for(int i = 0; i < N; ++i){
scanf("%d", &west[i]);
}
int k = 0;
for(int i = 0; i < N; ++i){
for(int j = 0; j < N; ++j){
pic[i][j] = k++;
}
}
--north[0];
--west[0];
ok = false;
dfs(0, 0, 0);
for(int i = 0; i <= num; ++i){
if(i) printf(" ");
printf("%d", ans[i]);
}
printf("\n");
return 0;
}
2016蓝桥杯决赛C/C++A组第四题 路径之谜的更多相关文章
- 2016蓝桥杯决赛C/C++A组第三题 打靶
题意: 小明参加X星球的打靶比赛.比赛使用电子感应计分系统.其中有一局,小明得了96分. 这局小明共打了6发子弹,没有脱靶.但望远镜看过去,只有3个弹孔.显然,有些子弹准确地穿过了前边的弹孔. 不同环 ...
- 关于2018年第九届蓝桥杯[C++省赛B组][第四题:测试次数]的疑问
题目来源:https://blog.csdn.net/qq_34202873/article/details/79784548 #标题:测试次数#x星球的居民脾气不太好,但好在他们生气的时候唯一的异常 ...
- 2013第四届蓝桥杯决赛Java高职高专组题目以及解法答案
2013第四届蓝桥杯决赛Java高职高专组题目以及解法答案 不知不觉离决赛都过去一个月了,一直忙于各种事情,都忘记整理一份试题.当作回忆也好. 1. 标题:好好学习 汤姆跟爷爷来中国旅游.一天,他帮助 ...
- 2018第九届蓝桥杯决赛(C++ B组)
逛了大半个北京还是挺好玩de 第一题 标题:换零钞 x星球的钞票的面额只有:100元,5元,2元,1元,共4种. 小明去x星旅游,他手里只有2张100元的x星币,太不方便,恰好路过x星银行就去换零钱. ...
- 2017第八届蓝桥杯决赛(C++ B组)4.发现环
描述 小明的实验室有N台电脑,编号1~N.原本这N台电脑之间有N-1条数据链接相连,恰好构成一个树形网络.在树形网络上,任意两台电脑之间有唯一的路径相连. 不过在最近一次维护网络时,管理员误操作使得某 ...
- 2017第八届蓝桥杯决赛(C++ B组)2.磁砖样式
磁砖样式 小明家的一面装饰墙原来是 310 的小方格. 现在手头有一批刚好能盖住2个小方格的长方形瓷砖. 瓷砖只有两种颜色:黄色和橙色. 小明想知道,对于这么简陋的原料,可以贴出多少种不同的花样来. ...
- 第八届蓝桥杯国赛java B组第三题
标题:树形显示 对于分类结构可以用树形来形象地表示.比如:文件系统就是典型的例子. 树中的结点具有父子关系.我们在显示的时候,把子项向右缩进(用空格,不是tab),并添加必要的连接线,以使其层次关系更 ...
- 蓝桥杯——剪邮票(2016JavaB组第10题)
剪邮票(16JavaB10) 如[图1], 有12张连在一起的12生肖的邮票. 现在你要从中剪下5张来,要求必须是连着的. (仅仅连接一个角不算相连) 比如,[图2],[图3]中,粉红色所示部分就是合 ...
- 蓝桥杯——压缩变换(2016JavaB组第9题)
压缩变换(16JavaB9) 小明最近在研究压缩算法. 他知道,压缩的时候如果能够使得数值很小,就能通过熵编码得到较高的压缩比. 然而,要使数值很小是一个挑战. 最近,小明需要压缩一些正整数的序列,这 ...
随机推荐
- Java的equals方法实现及其细节
判断两个对象是否等价,是OOP编程中常见的需求(下面围绕Java来进行阐述). 考虑这样几种情况:通过某个特征值来判断两个对象是否“等价”,当这两个对象等价时,判断结果为true,否则结果为false ...
- linux打包解压包(.tar .gz .tar.gz .zip)
01-.tar格式 解包:[*******]$ tar xvf FileName.tar 打包:[*******]$ tar cvf FileName.tar DirName(注:tar是打包,不是压 ...
- 图解jvm--(一)jvm内存结构
jvm内存结构 1.程序计数器 1.1 定义 Program Counter Register 程序计数器(寄存器) 作用,记住下一条jvm指令的执行地址 特点 是线程私有的 (唯一)不会存在内存溢出 ...
- Golang基础之文件操作
目录 文件读取 os.open文件读取 os.open循环读取 bufio文件读取 bufio循环读取 ioutil读取整个文件 文件写入 os.OpenFile文件写入 bufio.NewWrite ...
- Matplotlib 多个图形
章节 Matplotlib 安装 Matplotlib 入门 Matplotlib 基本概念 Matplotlib 图形绘制 Matplotlib 多个图形 Matplotlib 其他类型图形 Mat ...
- vim的几种模式&快捷键
vim的几种模式&快捷键 2017年01月01日 14:05:24 阅读数:3060 一.vim的模式 基本上vim可以分为三种模式:命令模式,插入模式和底行模式,其实vim有多种模式,我们只 ...
- 并行执行 Job【转】
有时,我们希望能同时运行多个 Pod,提高 Job 的执行效率.这个可以通过 parallelism 设置. 这里我们将并行的 Pod 数量设置为 2,实践一下: Job 一共启动了两个 Pod,而且 ...
- vCenter 导入Windows Server 2003/XP自定义规范失败
1.vcsa 切换到/etc/vmware-vpx/sysprep目录下,会有很多个目录,根据Windows Server 2003的版本,64位找到 svr2003-64 这个目录,32位找到svr ...
- java字符,字符串,数字之间的转换
string 和int之间的转换 string转换成int :Integer.valueOf("12") int转换成string : String.valueOf(12) ch ...
- 向量容器vector操作
1.向量容器vector 1.1 vector说明 进行vector操作前应添加头文件#include<vector>: vector是向量类型,可以容纳许多类型的数据,因此也被称为容器: ...