{"cells":[{"cell_type":"markdown","metadata":{"id":"9xoK4OIjIfZA"},"source":["#計算機程式設計二\n","#第十六週上課內容\n","## More on Problem Solving Using C++"]},{"cell_type":"markdown","source":["三個傳教士和三個食人族要划船過河。\n","小船一次最多只能坐兩個人。\n","在岸上時，食人族的人數不能超過傳教士人數。\n","請問該如何將所有人平安運送到對岸？"],"metadata":{"id":"knm-TENG3IYH"}},{"cell_type":"markdown","source":["![image.png](data:image/png;base64,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)"],"metadata":{"id":"KN9yHTb_2tpg"}},{"cell_type":"code","source":["%%writefile crossing.cpp\n","#include <algorithm>\n","#include <iostream>\n","#include <iterator>\n","#include <list>\n","#include <set>\n","#include <vector>\n","using namespace std;\n","class Crossing {\n"," using State = vector<int>;\n"," using Path = list<State>;\n"," public:\n","  // State (vector<int> s) \n","  // s[0]: # of missoinaries at the left side\n","  // s[1]: # of carnibals at the lefe side\n","  // s[2]: # m right \n","  // s[3]: # c right\n","  // s[4]: +1 for left , -1 for right\n","  Crossing(vector<int> ppl) : _npeople{ppl} {}\n","  set<State> extend(State s) {\n","    set<State> newStates;\n","    for (int i=0; i<=2; i++) {\n","      for (int j=0; i+j<=2; j++) {\n","        if (i+j==0) continue;\n","        State ns{s};\n","        ns[0] -= s[4] * i;\n","        ns[1] -= s[4] * j;\n","        ns[2] += s[4] * i;\n","        ns[3] += s[4] * j;\n","        ns[4] = -s[4];\n","        if (valid(ns)) {\n","          newStates.insert(ns);\n","        }\n","      }\n","    }\n","    return newStates;\n","  }\n","\n","  bool valid(State s) {\n","    if (s[0] != 0 && s[0] < s[1]) return false;\n","    if (s[2] != 0 && s[2] < s[3]) return false;\n","    return all_of(s.begin(), s.end()-1, [](int x) {return x >= 0;});\n","  }\n","\n","  bool is_solution(State s) {\n","    return s[0] == 0 && s[1] == 0 && s[4] == -1;\n","  }\n","\n","  void solve(int steps) {\n","    State init(5); // a vector of 5 integer elements\n","    init[0] = _npeople[0];\n","    init[1] = _npeople[1];\n","    init[4] = 1; // the boat is at the left side\n","    Path path;\n","    path.push_back(init);\n","    _paths.insert(path);\n","\n","    while (steps > 0) {\n","      set<Path> newPaths;\n","      for (auto& path : _paths) {\n","        set<State> newStates = extend(path.back());\n","        for (auto& st : newStates) {\n","          if (is_solution(st)) {\n","            Path new_path = path;\n","            new_path.push_back(st);\n","            _solutions.insert(new_path);\n","          }          \n","          if (_explored.find(st) != _explored.end()) continue;\n","          _explored.insert(st);\n","          Path new_path = path;\n","          new_path.push_back(st);\n","          newPaths.insert(new_path);\n","        }\n","      }\n","      _paths = newPaths;\n","      --steps;\n","    }\n","\n","  }\n","\n","  void show_state(State st) {\n","    cout << st[0] << \" \" << st[1] << \" | \" ;\n","    cout << st[2] << \" \" << st[3] << \" | \" ;\n","    if (st[4] > 0) cout << \"Left\\n\";\n","    else cout << \"Right\\n\";\n","  } \n","\n","  void show_solutions() \n","  {\n","      for (auto& path : _solutions) {\n","        for (auto& st : path) {\n","          show_state(st);\n","        }\n","        cout << \"----------------\\n\";\n","      }\n","  }\n","\n"," private:\n","  vector<int> _npeople;\n","  set<State> _explored;\n","  set<Path> _paths;\n","  set<Path> _solutions;\n","\n","};\n","int main()\n","{\n","    vector<int> people={3,3};\n","    Crossing problem(people);\n","    problem.solve(20);\n","    problem.show_solutions();\n","}"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"ELG_prxaLqbq","executionInfo":{"status":"ok","timestamp":1672142899040,"user_tz":-480,"elapsed":279,"user":{"displayName":"HT Chen","userId":"17748361917871513601"}},"outputId":"f1babdb0-def3-44f9-decd-812687cf0b75"},"execution_count":68,"outputs":[{"output_type":"stream","name":"stdout","text":["Overwriting crossing.cpp\n"]}]},{"cell_type":"code","source":["%%shell\n","g++ crossing.cpp -o crossing -std=c++1z\n","./crossing\n","\n"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"CSBLdXlXN34a","executionInfo":{"status":"ok","timestamp":1672142902729,"user_tz":-480,"elapsed":1322,"user":{"displayName":"HT Chen","userId":"17748361917871513601"}},"outputId":"970010a3-65c7-4063-c69e-9cabdb93e6b5"},"execution_count":69,"outputs":[{"output_type":"stream","name":"stdout","text":["3 3 | 0 0 | Left\n","2 2 | 1 1 | Right\n","3 2 | 0 1 | Left\n","3 0 | 0 3 | Right\n","3 1 | 0 2 | Left\n","1 1 | 2 2 | Right\n","2 2 | 1 1 | Left\n","0 2 | 3 1 | Right\n","0 3 | 3 0 | Left\n","0 1 | 3 2 | Right\n","0 2 | 3 1 | Left\n","0 0 | 3 3 | Right\n","----------------\n","3 3 | 0 0 | Left\n","2 2 | 1 1 | Right\n","3 2 | 0 1 | Left\n","3 0 | 0 3 | Right\n","3 1 | 0 2 | Left\n","1 1 | 2 2 | Right\n","2 2 | 1 1 | Left\n","0 2 | 3 1 | Right\n","0 3 | 3 0 | Left\n","0 1 | 3 2 | Right\n","0 2 | 3 1 | Left\n","0 0 | 3 3 | Right\n","0 1 | 3 2 | Left\n","0 0 | 3 3 | Right\n","----------------\n","3 3 | 0 0 | Left\n","2 2 | 1 1 | Right\n","3 2 | 0 1 | Left\n","3 0 | 0 3 | Right\n","3 1 | 0 2 | Left\n","1 1 | 2 2 | Right\n","2 2 | 1 1 | Left\n","0 2 | 3 1 | Right\n","0 3 | 3 0 | Left\n","0 1 | 3 2 | Right\n","1 1 | 2 2 | Left\n","0 0 | 3 3 | Right\n","----------------\n"]},{"output_type":"execute_result","data":{"text/plain":[]},"metadata":{},"execution_count":69}]},{"cell_type":"code","source":["%%writefile missionary.cpp\n","#include <algorithm>\n","#include <iostream>\n","#include <iterator>\n","#include <list>\n","#include <set>\n","#include <sstream>\n","#include <string>\n","#include <vector>\n","using namespace std;\n","// A state contains five components:\n","// The first two components denote the current numbers of\n","// missionaries and cannibals at the left bank of the river.\n","// The third and fourth components denote the current numbers\n","// of missionaries and cannibals at the right bank.\n","// The fifth component denotes the location of the boat:\n","// 1 means \"left bank\" and -1 means \"right bank\".\n","using State = vector<int>;\n","class Crossing {\n","private:\n","  vector<int> _npeople; // how many missionaries and cannibals\n","                        // we use vector<int> as a tuple (int, int)\n","                        // the first integer indicate the number of missionaries\n","                        // the second integer indicates the number of cannibals\n","  set<list<State>> _paths; // trial paths in progress\n","  set<State> _explored;    // explored states\n","  set<list<State>> _solutions;\n","\n","public:\n","  // specify the numbers of missionaries and cannibals\n","  Crossing(vector<int> np) : _npeople{np} {}\n","  // we may use s[4] to indicate the direction\n","  State Go(State s, int missionary, int cannibal) {\n","    s[0] = s[0] - s[4] * missionary;\n","    s[1] = s[1] - s[4] * cannibal;\n","    s[2] = s[2] + s[4] * missionary;\n","    s[3] = s[3] + s[4] * cannibal;\n","    s[4] = -s[4];\n","    return s;\n","  }\n","  \n","  // check the validity of a state\n","  bool valid(State s) {\n","    if (s[0] < 0 || s[1] < 0 || s[2] < 0 || s[3] < 0)\n","      return false;\n","    // cannibals must not outnumber missionaries\n","    if (s[0] < s[1] && s[0] != 0)\n","      return false;\n","    if (s[2] < s[3] && s[2] != 0)\n","      return false;\n","\n","    return true;\n","  }\n","\n","  set<State> extend(State s) {\n","    set<State> nextStates;\n","\n","    for (int m = 0; m <= 2; m++) {\n","      for (int c = 0; c <= 2; c++) {\n","        // a boat can take one or two people\n","        if (m + c >= 1 && m + c <= 2) {\n","          State ss = Go(s, m, c);\n","          if (valid(ss))\n","            nextStates.insert(ss);\n","        }\n","      }\n","    }\n","    return nextStates;\n","  }\n","\n","  // check if all people are at the right bank\n","  bool found(State s) {\n","    // s[4]==-1 means the boat is at the right bank\n","    if (s[0] == 0 && s[1] == 0 && s[4] == -1)\n","      return true;\n","    else\n","      return false;\n","  }\n","\n","  void solve(int steps) {\n","    list<State> initialPath;\n","\n","    State ss{_npeople}; // numbers of people at the left\n","    ss.push_back(0);    // no missionary at the right bank\n","    ss.push_back(0);    // no cannibals at the right bank\n","    ss.push_back(1);    // 1 means the boat at the left bank\n","\n","    initialPath.push_back(ss);  // create the initial path\n","    _paths.insert(initialPath); // add the initial path into the path set _paths\n","\n","    // same strategy as in the water jugs problem\n","    while (steps > 0) {\n","      set<list<State>> newPaths;\n","\n","      for (auto p : _paths) {\n","        auto nextStates = extend(p.back());\n","        _explored.insert(p.back());\n","        for (auto s : nextStates) {\n","          if (found(s)) {\n","            auto np = p;\n","            np.push_back(s);\n","            _solutions.insert(np);\n","          } else {\n","            auto search = _explored.find(s);\n","            if (search == _explored.cend()) {\n","              auto np = p;\n","              np.push_back(s);\n","              newPaths.insert(np);\n","            }\n","          }\n","        }\n","      }\n","\n","      _paths = newPaths;\n","\n","      --steps;\n","    }\n","  }\n","  void show_solutions() {\n","    for (auto path : _solutions) {\n","      for (auto s : path) {\n","        if (!s.empty()) {\n","          cout << \"(\" << s[0] << \", \" << s[1] << \")\";\n","          cout << \"(\" << s[2] << \", \" << s[3] << \")\";\n","          if (s[4] == 1)\n","            cout << \" left\\n\";\n","          else\n","            cout << \" right\\n\";\n","        }\n","      }\n","      cout << \"done\" << endl;\n","    }\n","  }\n","};\n","\n","int main() {\n","  vector<int> people = {3, 3};\n","  Crossing p(people);\n","  p.solve(25);\n","  p.show_solutions();\n","}\n"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"-e8ZHDU4ZzdL","executionInfo":{"status":"ok","timestamp":1672127095972,"user_tz":-480,"elapsed":276,"user":{"displayName":"HT Chen","userId":"17748361917871513601"}},"outputId":"906f14df-3a3d-462c-c888-8bab4d442d22"},"execution_count":9,"outputs":[{"output_type":"stream","name":"stdout","text":["Overwriting missionary.cpp\n"]}]},{"cell_type":"code","source":["%%shell\n","g++ missionary.cpp -o missionary -std=c++1z\n","./missionary"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"eouw4encWqlo","executionInfo":{"status":"ok","timestamp":1672126970502,"user_tz":-480,"elapsed":1319,"user":{"displayName":"HT Chen","userId":"17748361917871513601"}},"outputId":"d9381e5a-b86e-41ee-cde8-f36f5a925b29"},"execution_count":6,"outputs":[{"output_type":"stream","name":"stdout","text":["(3, 3)(0, 0) left\n","(2, 2)(1, 1) right\n","(3, 2)(0, 1) left\n","(3, 0)(0, 3) right\n","(3, 1)(0, 2) left\n","(1, 1)(2, 2) right\n","(2, 2)(1, 1) left\n","(0, 2)(3, 1) right\n","(0, 3)(3, 0) left\n","(0, 1)(3, 2) right\n","(0, 2)(3, 1) left\n","(0, 0)(3, 3) right\n","done\n","(3, 3)(0, 0) left\n","(2, 2)(1, 1) right\n","(3, 2)(0, 1) left\n","(3, 0)(0, 3) right\n","(3, 1)(0, 2) left\n","(1, 1)(2, 2) right\n","(2, 2)(1, 1) left\n","(0, 2)(3, 1) right\n","(0, 3)(3, 0) left\n","(0, 1)(3, 2) right\n","(1, 1)(2, 2) left\n","(0, 0)(3, 3) right\n","done\n","(3, 3)(0, 0) left\n","(3, 1)(0, 2) right\n","(3, 2)(0, 1) left\n","(3, 0)(0, 3) right\n","(3, 1)(0, 2) left\n","(1, 1)(2, 2) right\n","(2, 2)(1, 1) left\n","(0, 2)(3, 1) right\n","(0, 3)(3, 0) left\n","(0, 1)(3, 2) right\n","(0, 2)(3, 1) left\n","(0, 0)(3, 3) right\n","done\n","(3, 3)(0, 0) left\n","(3, 1)(0, 2) right\n","(3, 2)(0, 1) left\n","(3, 0)(0, 3) right\n","(3, 1)(0, 2) left\n","(1, 1)(2, 2) right\n","(2, 2)(1, 1) left\n","(0, 2)(3, 1) right\n","(0, 3)(3, 0) left\n","(0, 1)(3, 2) right\n","(1, 1)(2, 2) left\n","(0, 0)(3, 3) right\n","done\n"]},{"output_type":"execute_result","data":{"text/plain":[]},"metadata":{},"execution_count":6}]},{"cell_type":"markdown","source":["四個人要過橋，天色很暗，走的時候必須拿火把照路才不會跌到橋下。橋很窄、火把亮度有限，所以同時最多只能兩個人一起走。四個人的走路速度不同，過橋所需的時間分別是 1, 2, 5, 10 分鐘，當兩個人一起走的時候，過橋時間必須遷就走得慢的那個人。請問最快要花多少時間可以讓四個人都到橋的另一邊？"],"metadata":{"id":"o53eZrMd36lZ"}},{"cell_type":"markdown","source":["![image.png](data:image/png;base64,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CIiACIiACHgCEm1PQmsREAEREAERyHMCEu08LyBlTwREQAREQAQ8AYm2J6G1CIiACIiACOQ5AYl2nheQsicCIiACIiACnoBE25PQWgREQAREQATynIBEO88LSNkTAREQAREQAU9Aou1JaC0CIiACIiACeU5Aop3nBaTsiYAIiIAIiIAnINH2JLQWAREQAREQgTwnINHO8wJS9kRABERABETAE5BoexJai4AIiIAIiECeE5Bo53kBKXsiIAIiIAIi4AlItD0JrUVABERABEQgzwlItPO8gJQ9ERABERABEfAEJNqehNYiIAIiIAIikOcEJNp5XkDKngiIgAiIgAh4AhJtT0JrERABERABEchzAhLtPC8gZU8EREAEREAEPAGJtiehtQiIgAiIgAjkOQGJdp4XkLInAiIgAiIgAp6ARNuT0FoEREAEREAE8pyARDvPC0jZEwEREAEREAFPQKLtSWgtAiIgAiIgAnlOQKKd5wWk7ImACIiACIiAJyDR9iS0FgEREAEREIE8JyDRzvMCUvZEQAREQAREwBOQaHsSWouACIiACIhAnhOQaOd5ASl7IiACIiACIuAJSLQ9Ca1FQAREQAREIM8JSLTzvICUPREQAREQARHwBCTanoTWIiACIiACIpDnBCTaeV5Ayp4IiIAIiIAIeAISbU9CaxEQAREQARHIcwIS7TwvIGVPBERABERABDwBibYnobUIiIAIiIAI5DkBiXaeF5CyJwIiIAIiIAKegETbk9BaBERABERABPKcgEQ7zwtI2RMBERABERABT0Ci7UloLQIiIAIiIAJ5TkCinecFpOyJgAiIgAiIgCcg0fYktBYBERABERCBPCcg0c7zAlL2REAEREAERMATkGh7ElqLgAiIgAiIQJ4TkGjneQEpeyIgAiIgAiLgCUi0PQmtRUAEREAERCDPCUi087yAlD0REAEREAER8AQk2p6E1iIgAiIgAiKQ5wQk2nleQMqeCIiACIiACHgCEm1PQmsREAEREAERyHMCEu08LyBlTwREQAREQAQ8AYm2J6G1CIiACIiACOQ5AYl2nheQsicCIiACIiACnoBE25PQWgREQAREQATynIBEO88LSNkTAREQAREQAU9Aou1JaC0CIiACIiACeU5Aop3nBaTsiYAIiIAIiIAnINH2JLQWgW5NIGOZTNot6XSq6U64b9u2rZa9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)"],"metadata":{"id":"5Rxn3Yp23B22"}},{"cell_type":"code","source":["%%writefile torch.cpp\n","#include <iostream>\n","#include <vector>\n","#include <algorithm>\n","#include <map>\n","#include <set>\n","#include <queue>\n","#include <iterator>\n","using namespace std;\n","class Torch\n","{\n","private:\n","    struct State {\n","        vector<int> here;\n","        vector<int> there;\n","        int direction;\n","        State() { }\n","        State(vector<int> ini): here(ini.size()), there(ini.size()), direction {1} {\n","            for(int& i : here) // here = {0, 0, 1, 1} there = {1, 1, 0, 0}\n","            {\n","                i = 1;\n","            }\n","        }\n","        State(const State& s): here{s.here}, there{s.there}, direction{s.direction} { }\n","        State& operator=(const State & s)\n","        {\n","            State localstate{s};\n","            swap(here, localstate.here);\n","            swap(there, localstate.there);\n","            direction = localstate.direction;\n","            return *this;\n","        }\n","\n","        bool operator<(const State & s) const\n","        {\n","            return (here < s.here) || ((here == s.here) && (there < s.there))\n","            || ((here == s.here) && (there == s.there) && direction < s.direction);\n","        }\n","\n","        void show()\n","        {\n","            for (const auto& t : here) {\n","                cout << t << \" \";\n","            }\n","            cout << \"| \";\n","            for (const auto& t : there) {\n","                cout << t << \" \";\n","            }\n","            if (direction == 1)\n","                cout << \" Left\\n\";\n","            else\n","                cout << \" Right\\n\";\n","        }\n","    }; // end of struct State\n","\n","    using Choice = pair<int, State>;\n","\n","    vector<int> walking_time;\n","    map<State, int> best_cost;\n","    map<State, State> prev_state;\n","\n","\n","    set<Choice> extend(Choice ch)\n","    {\n","            set<Choice> nextChoices;\n","            int dir = ch.second.direction;\n","            for (unsigned int i=0; i<ch.second.here.size(); ++i) {\n","                if (ch.second.here[i]==dir) {\n","                    // alone\n","                    State ns(ch.second);\n","                    ns.here[i] = 1-dir; // 0 -> 1 or 1 -> 0\n","                    ns.there[i] = dir;\n","                    ns.direction = 1-dir;\n","                    Choice nc = make_pair(ch.first-walking_time[i], ns);\n","                    nextChoices.insert(nc);\n","                    // with company\n","                    for (unsigned int j=i+1; j<ch.second.here.size(); ++j) {\n","                        if (ns.here[j]==dir) {\n","                            State ns2(ns);\n","                            ns2.here[j] = 1-dir;\n","                            ns2.there[j] = dir;\n","                            int total_cost =\n","                                (walking_time[i]>walking_time[j])\n","                                ? walking_time[i] : walking_time[j];\n","                            Choice nc2 = make_pair(ch.first-total_cost, ns2);\n","                            nextChoices.insert(nc2);\n","                        }\n","                    }\n","                }\n","            }\n","\n","        return nextChoices;\n","    }\n","\n","    bool found(State s)\n","    {\n","        if (s.direction==1) return false;\n","        return all_of(s.here.begin(), s.here.end(), [](int x){return x==0;});\n","    }\n","\n","    void trace_back(State s)\n","    {\n","        State ini(walking_time); // here={1, 1, 1, 1}, there={0, 0, 0, 0}\n","        while (s<ini || ini<s) {\n","            s.show();\n","            State ns = prev_state[s];\n","            s = ns;\n","        }\n","        ini.show();\n","    }\n","\n","public:\n","\n","    Torch(vector<int> wt): walking_time {wt} { }\n","    void solve()\n","    {\n","        State initialState(walking_time);\n","        Choice item = make_pair(0, initialState);\n","        prev_state[initialState] = initialState;\n","\n","        priority_queue<Choice> pq;\n","        pq.push(item);\n","\n","        while (!pq.empty()) {\n","            Choice currentChoice = pq.top();\n","            pq.pop();\n","\n","            if (found(currentChoice.second)) {\n","                cout << \"Answer: \";\n","                cout << -currentChoice.first << \"\\n\";\n","                cout << \"Tracing back:\\n\";\n","                trace_back(currentChoice.second);\n","                break;\n","            }\n","\n","            set<Choice> chs = extend(currentChoice);\n","            for (auto c : chs) {\n","                int newCost = c.first;\n","                State newState = c.second;\n","                auto search = best_cost.find(newState);\n","                if (search == best_cost.cend() || newCost > best_cost[newState]) {\n","                    best_cost[newState] = newCost;\n","                    prev_state[newState] = currentChoice.second;\n","                    Choice newItem = make_pair(newCost, newState);\n","                    pq.push(newItem);\n","                }\n","            }\n","\n","        }\n","\n","    }\n","};\n","\n","int main()\n","{\n","    vector<int> walking_time = {1, 2, 5, 10};\n","    Torch problem(walking_time);\n","    problem.solve();\n","}\n"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"MvEW_GLE2VDW","executionInfo":{"status":"ok","timestamp":1672147635612,"user_tz":-480,"elapsed":271,"user":{"displayName":"HT Chen","userId":"17748361917871513601"}},"outputId":"fdc24cbe-d52a-4d60-9cb2-b7af0e666637"},"execution_count":84,"outputs":[{"output_type":"stream","name":"stdout","text":["Overwriting torch.cpp\n"]}]},{"cell_type":"code","source":["%%shell\n","g++ torch.cpp -o torch -std=c++1z\n","./torch"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"HJ7UNHP82cJl","executionInfo":{"status":"ok","timestamp":1672147640412,"user_tz":-480,"elapsed":1432,"user":{"displayName":"HT Chen","userId":"17748361917871513601"}},"outputId":"6f030b16-4393-4b3f-b7ef-44de053e7243"},"execution_count":85,"outputs":[{"output_type":"stream","name":"stdout","text":["Answer: 17\n","Tracing back:\n","0 0 0 0 | 1 1 1 1  Right\n","1 1 0 0 | 0 0 1 1  Left\n","1 0 0 0 | 0 1 1 1  Right\n","1 0 1 1 | 0 1 0 0  Left\n","0 0 1 1 | 1 1 0 0  Right\n","1 1 1 1 | 0 0 0 0  Left\n"]},{"output_type":"execute_result","data":{"text/plain":[]},"metadata":{},"execution_count":85}]}],"metadata":{"colab":{"provenance":[{"file_id":"1AB3RNlLfkZBSZKu6_Wh20CkIpbxfJIve","timestamp":1663461789208}],"authorship_tag":"ABX9TyNrEQg6TKt2RnPWZFPWiDwk"},"gpuClass":"premium","kernelspec":{"display_name":"Python 3","name":"python3"},"language_info":{"name":"python"}},"nbformat":4,"nbformat_minor":0}