
2019年第十届蓝桥杯国赛B组试题E-路径计数-dfs(坑题)
本题属于路径计数问题,限定条件为:路线总长度不超过12;最后回到起点;路线不自交;且不走出矩阵范围。 路线不自交意味着不能有交叉点,走出矩阵范围也不能超出。 方格边的方向只允许上下左右四个方向移动,可能与方向有关而产生不同的路径。
发布日期:2021-05-09 23:44:03
浏览次数:23
分类:精选文章
本文共 1183 字,大约阅读时间需要 3 分钟。
【问题描述】
从一个5x5的方格矩阵的左上角出发,沿着方格的边走,满足以下条件的路线有多少种?条件:
总长度不超过12; 最后回到左上角; 路线不自交; 不走出5x5的方格矩阵范围之外。【示例】
ABC是三种合法的路线。注意B和C由于方向不同,所以视为不同的路线。【分析】
【代码改进】
原代码使用了DFS深度优先搜索来计算路径数量,但终止条件设置有误。原代码错误原因
在终止条件中,设置为:if (x == 0 && y == 0 && u != 0)
修改后的代码
将终止条件修改为:if (x == 0 && y == 0 && u > 2)
改进后的代码
#includeusing namespace std; int dx[] = {0, 0, 1, -1}; int dy[] = {1, -1, 0, 0}; const int N = 7; bool vis[N][N]; int ans; void dfs(int x, int y, int u) { if (u > 12) return; if (x == 0 && y == 0 && u > 2) { ans++; return; } for (int i = 0; i < 4; i++) { int xx = x + dx[i]; int yy = y + dy[i]; if (xx < 0 || xx > 5 || yy < 0 || yy > 5 || vis[xx][yy]) continue; vis[xx][yy] = true; dfs(xx, yy, u + 1); vis[xx][yy] = false; } } int main() { dfs(0, 0, 0); cout << ans << endl; return 0; }
【验证】
通过测试和验证,发现修改后的代码能够正确排除自交的路径,从而得到正确的计数结果。发表评论
最新留言
能坚持,总会有不一样的收获!
[***.219.124.196]2025年04月29日 09时13分09秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
大佬谈接口自动化,我是这样做测试框架开发的……
2019-03-14
C++版浙大PAT乙级1069(20分)测试点3答案错误解决方法
2019-03-14
浏览器刷新页面
2019-03-14
easyui日期处理(开始时间和结束时间)
2019-03-14
java文件上传
2019-03-14
Callable中call方法和Runnable中run方法的区别
2019-03-14
超市账单管理系统
2019-03-14
Springboot实现热部署
2019-03-14
需求分析
2019-03-14
查找单链表中倒数第k个节点
2019-03-14
创建组出现错误:对COM组件的调用返回了错误 HRESULT E_FAIL。小敏
2019-03-14
Linux yum提示Loaded plugins错误的解决方法
2019-03-14
Netty的体系结构及使用
2019-03-14
xshell解决文本粘贴格式错误
2019-03-14
什么是证券型代币?
2019-03-14
Android中获取并设置屏幕亮度
2019-03-14
Windows抓包工具-Fiddler
2019-03-14
Swift中使用DispatchGroup分组管理异步任务
2019-03-14
21-JS中常见的函数
2019-03-14
Android多线程与双缓冲
2019-03-14