原题链接:蓝桥杯2015年第六届真题-穿越雷区
解题思路:
DFS 核心代码,根据题意添加操作。
void DFS( 状态参数 ) { if ( 目的状态 ) { 目的操作 return; } for ( 搜索方式(移动) ) { if ( 合法状态 ) { 操作 标记 DFS( 更新状态参数 ) 回溯 ( 还原标记 ) } } }
注意事项:
因为行字符间格了空格,所有沿着行搜索的时候步数需要 +2 个单位。
参考代码:
#include<bits/stdc++.h> using namespace std; char Map[105][105]; /* 保存图 */ bool vis[105][105] = { false }; /* 标记走过的点 */ int map_size; /* 方阵大小 */ int moveX[4] = { -1,0,1,0 }; /* 每一步移动的距离 */ int moveY[4] = { 0,-2,0,2 }; int minstep = 9999; struct status { /* 保存当前位置 */ int X, Y; }; void DFS(int X, int Y, int step) { /* 走到出口比较步数 */ if (Map[X][Y] == 'B') { if (step < minstep) minstep = step; return; } for (int i = 0; i < 4; i++) { status moving; /* 四个方向搜索 */ moving.X = X + moveX[i]; moving.Y = Y + moveY[i]; /* 判断边界 */ /* 判断是否走过 */ /* 判断字符异同 */ /* 特别注意Y < 2 * map_size */ if (moving.X >= 0 && moving.Y >= 0 && moving.X < map_size && moving.Y < map_size * 2 && vis[moving.X][moving.Y] != true && Map[moving.X][moving.Y] != Map[X][Y]) { vis[moving.X][moving.Y] = true; DFS(moving.X, moving.Y, step + 1); /* 回溯状态 */ vis[moving.X][moving.Y] = false; } } } int main() { cin >> map_size; cin.get(); for (int i = 0; i < map_size; i++) { gets(Map[i]); } bool start = false; /* 寻找起点位置 */ int position1, position2; for (position1 = 0; position1 < map_size; position1++) { for (position2 = 0; position2 < map_size; position2++) if (Map[position1][position2] == 'A') { start = true; break; } if (start == true) break; } /* 搜索 */ vis[position1][position2] = true; DFS(position1, position2, 0); if (minstep == 9999) cout << -1 << endl; else cout << minstep << endl; }
0.0分
6 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复