A1091 Acute Stroke (30 分)

一开始照着二维数组的逻辑去做,按照周围八个点的顺序遍历,居然 PA 也有 21 分... 后来自己找了好几个例子仍然没办法通过,这一看晴神的解析才发现这题是按三维数组去做的,而且遍历顺序是题目 Figure-1 的那 6 个点,emmm

三维数组大致如下( z 轴我只画了两层):

然后基本上套模板就行了,总的下来解 BFS() 主要是这三个方面

/* 看到 BFS() 要想到 */

1、晴神给的模板
2、坐标点的有效条件
3、什么样的坐标点才算是 "附近的点"

对于这道题,这样填充套模板:

/* 1、晴神给的模板 */
int
bfs(起点s) { /* 起点入队 */ queue<node_t> q; q.push(s); inq[坐标点] = true; while (!q.empty()) { /* 访问队头,然后出队 */ node_t top = q.front(); q.pop(); /* bfs() 遍历 */ for (遍历 top 周围) { if (这个坐标点有效) { 入队(这个坐标点); inq[这个坐标点] = true; } } } }

(由于这道题要数点,所以后面要稍微改改,需要在 BFS() 的同时记录遍历到的 "有效" 点的数量)

模板中主要关注两处:1)  for() 循环条件:"遍历 top 周围"2) for() 循环里面的 if() 的条件:"坐标点有效"

/* 2、坐标点的有效条件 */
bool isValid(坐标点的各维度坐标..) {
    if (越界)    return false;
    if (该坐标点等于 0 || 该坐标点入队过)    return false;
    return true;
}

/* 3、什么样的坐标点才算是 "附近的点" */
这道题是六个方位:左、右、前、后、上、下

根据这些逻辑填充好模板就 ojbk

点击获取完整代码

原文地址:https://www.cnblogs.com/bEngi1/p/14409404.html