头像

Cyan

四川成都

深度强化学习炼丹师

2020第十一届蓝桥杯国赛-E玩具蛇

2020第十一届蓝桥杯国赛-E玩具蛇

2021-07-03 · 27次阅读 · 原创 · 数据结构与算法

题面

【问题描述】

小蓝有一条玩具蛇,一共有 16 节,上面标着数字 1 至 16。每一节都是一 个正方形的形状。相邻的两节可以成直线或者成 90 度角。

小蓝还有一个 4 × 4 的方格盒子,用于存放玩具蛇,盒子的方格上依次标着 字母 A 到 P 共 16 个字母。

小蓝可以折叠自己的玩具蛇放到盒子里面。他发现,有很多种方案可以将玩具蛇放进去。

下图给出了两种方案:

snake.png

请帮小蓝计算一下,总共有多少种不同的方案。如果两个方案中,存在玩 具蛇的某一节放在了盒子的不同格子里,则认为是不同的方案。

【答案提交】

这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一 个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

思路

DFS,从盒子的每个位置开始放,深度优先搜索,注意控制边界条件,递归16层即为一种合法方案,计数器加一。

答案:552

代码

#include<iostream> #include<cstring> using namespace std; int res = 0, dir[4][2] = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}}; int g[5][5]; void dfs(int i, int j, int k) { if (k == 17) { res++; return; } for (int d = 0; d < 4; d++) { int ti = i + dir[d][0], tj = j + dir[d][1]; if (ti < 1 || ti > 4 || tj < 1 || tj > 4) continue; if (g[ti][tj]) continue; g[ti][tj] = k; dfs(ti, tj, k + 1); g[ti][tj] = 0; } } int main() { for (int i = 1; i <= 4; i++) { for (int j = 1; j <= 4; j++) { g[i][j] = 1; dfs(i, j, 2); memset(g, 0, sizeof(g)); } } cout << res << endl; return 0; }

标题: 2020第十一届蓝桥杯国赛-E玩具蛇
链接: https://www.fightingok.cn/detail/108
更新: 2022-09-18 22:39:30
版权: 本文采用 CC BY-NC-SA 3.0 CN 协议进行许可