天天看點

A1091 Acute Stroke (30 分)

一開始照着二維數組的邏輯去做,按照周圍八個點的順序周遊,居然 PA 也有 21 分... 後來自己找了好幾個例子仍然沒辦法通過,這一看晴神的解析才發現這題是按三維數組去做的,而且周遊順序是題目 Figure-1 的那 6 個點,emmm

三維數組大緻如下( z 軸我隻畫了兩層):

A1091 Acute Stroke (30 分)
然後基本上套模闆就行了,總的下來解 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

點選擷取完整代碼