[Puzzle] 螞蟻路線碰撞問題

有這麼一道題目, 看下面的圖, 假設有一條直線, 每個叉叉上有一隻螞蟻, 它們會隨機選擇一個方向, 向前或者向後移動, 每次走一格, 前進中當兩隻螞蟻相遇, 它們會掉頭, 問: 全部螞蟻都走出去的最長和最短步數;

最短步數很明顯...只要方向對了, 就是11;

最長呢...在看到問題時腦子裏第一個反應是: 沒有儲存對這類問題的算法, 然後開始模擬螞蟻行進路線, 發現可能性太多, 簡直就是一個分子碰撞大混亂的情形...比如 3向右, 7向左, 11向左, 那樣3和7碰撞, 7調頭, 會和11碰撞, 然後在調頭...腦子內存不夠模擬...

然後我準備寫一下代碼:

// 螞蟻路線問題: 一條直線上多隻螞蟻, 相遇則反轉方向, 計算最長爬行距離
int pts[] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,
            16,17,18,19,20,21,22,23,24,25};
class Ant {
public:
    Ant(int p, int d): m_pos(p),m_direction(d) {}
    void move(int x) {
        if(m_direction > 0)
            m_pos += x;
        else
            m_pos -= x;
    }
    void turnBack() {
        m_direction *= -1;
    }

    int m_pos;
    int m_direction;
};

Ant firstMeet(const QList <Ant>& list) {
    // all the ants always ascending order
    Ant a = list.first();
    for (int i = 1; i < list.size(); i++) {
        if(a.m_pos == list[i].m_pos)
            return a;
    }
}

void path() {
    QList <Ant> aList;
    Ant a1(3, 1); aList.append(a1);
    Ant a2(7, 1); aList.append(a2);
    Ant a3(11, 1); aList.append(a3);
    Ant a4(16, -1); aList.append(a4);
    Ant a5(20, -1); aList.append(a5);

    bool antsLeave = false;
    while (antsLeave) {

    }
}

花了幾分鐘寫到這裏的時候, 停下來考慮要給Ant id, 給各種方向做所有的情況遍歷...考慮有不只一對螞蟻同時相遇的情況等等等等...我突然醒悟了....這不是程序題目, 如果你腦洞大一些, 就能明白, 最大值就是那個離開目標最遠的螞蟻要走的步數, 這裏是22, 不勞煩計算機把所有case嘗試一遍了;

[YCR]


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章