{"nbformat":4,"nbformat_minor":0,"metadata":{"colab":{"name":"Week05.ipynb","provenance":[],"authorship_tag":"ABX9TyPjTf+pQ7TOOpQEfbRmDAzQ"},"kernelspec":{"name":"python3","display_name":"Python 3"},"language_info":{"name":"python"}},"cells":[{"cell_type":"markdown","source":["# 第五週上課內容"],"metadata":{"id":"9xoK4OIjIfZA"}},{"cell_type":"markdown","source":["###GitHub 教材參考資料\n","\n","1. for loop 以及雙層 for loop\n","2. 條件判斷 `if else`   `&&` 與 `||` 與 `!`\n","3. 迴圈和條件判斷搭配\n","\n","\n","\n","https://github.com/htchen/i2p-nthu/tree/master/程式設計一/Operators%2C%20Expressions%2C%20and%20Statements\n","\n","https://github.com/htchen/i2p-nthu/tree/master/程式設計一/Looping\n","\n","https://github.com/htchen/i2p-nthu/blob/master/程式設計一/if%20else/if%20else.md\n"],"metadata":{"id":"05G1Fqg6GRZX"}},{"cell_type":"markdown","source":["回顧上一週"],"metadata":{"id":"m8Mdi3K_0J0D"}},{"cell_type":"code","source":["%%writefile E04_06.c\n","/*\n","定義一個 function (取名為 check)\n","\n","檢驗下面的 expression \n","\n","根據 expression 的值\n","\n","輸出對應的資訊 \"True\" 或 \"False\"\n","\n","*/\n","#include <stdio.h>\n","void check(int);\n","\n","int main(void)\n","{\n","   int x = 5; \n","   int y = 3;\n","   \n","   check(x > 2 && y == 3);\n","   check( !(x < 2 || y == 3));\n","   check(x != 0 && y);\n","   check(x == 0 || !y);\n","   check(x != y && (20/x) < y);\n","   check( !(y>5 || y<2) && !(x%5));\n","   check(!x && x);\n","       \n","   return 0;\n","}\n","\n","\n","void check(int cond)\n","{\n","  if (cond) { \n","      printf(\"cond = %d means True.\\n\", cond);\n","  } else {\n","      printf(\"cond = %d means False.\\n\", cond);\n","  }\n","}\n"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"0mw6JWUW0AcH","executionInfo":{"status":"ok","timestamp":1647342617819,"user_tz":-480,"elapsed":252,"user":{"displayName":"HT Chen","photoUrl":"https://lh3.googleusercontent.com/a/default-user=s64","userId":"17748361917871513601"}},"outputId":"d0e2d5a2-7298-4e9c-9492-201f77838daa"},"execution_count":44,"outputs":[{"output_type":"stream","name":"stdout","text":["Overwriting E04_06.c\n"]}]},{"cell_type":"code","source":["%%shell\n","gcc E04_06.c -o E04_06\n","./E04_06"],"metadata":{"id":"GUvRctw8a1Mx","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1647342620403,"user_tz":-480,"elapsed":254,"user":{"displayName":"HT Chen","photoUrl":"https://lh3.googleusercontent.com/a/default-user=s64","userId":"17748361917871513601"}},"outputId":"ea97d099-c322-431a-e4c5-8bd16b23d1bd"},"execution_count":45,"outputs":[{"output_type":"stream","name":"stdout","text":["cond = 1 means True.\n","cond = 0 means False.\n","cond = 1 means True.\n","cond = 0 means False.\n","cond = 0 means False.\n","cond = 1 means True.\n","cond = 0 means False.\n"]},{"output_type":"execute_result","data":{"text/plain":[""]},"metadata":{},"execution_count":45}]},{"cell_type":"markdown","source":["回顧上一週\n","找出滿足餘數條件的最小正數"],"metadata":{"id":"jUvTa6IsbHE0"}},{"cell_type":"code","source":["%%writefile E04_07.c\n","/*\n","Find the smallest N that satisfies\n","    N % x == a\n","    N % y == b\n","    N % z == c\n","For example,\n","if x=3, y=5, z=7, and a=2, b=3, c=4,\n","then, N is 53 since\n","    53 % 3 == 2\n","    53 % 5 == 3\n","    53 % 7 == 4\n","and 53<=3*5*7.\n","\n","Another test case:\n","Input:\n","23 29 37\n","10 20 30\n","Output:\n","14201\n"," */\n","#include <stdio.h>\n","int main(void)\n","{\n","    int x, y, z;\n","    int a, b, c;\n","    int i;\n","    scanf(\"%d%d%d\", &x, &y, &z);\n","    scanf(\"%d%d%d\", &a, &b, &c);\n","    for (i=1; i<=x*y*z*5; i++) {\n","          if (i%x==a && i%y==b && i%z==c) {\n","            printf(\"%d\\n\", i);\n","            break;\n","          }\n","    }\n","    return 0;\n","}"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"zzerIzxQbDDy","executionInfo":{"status":"ok","timestamp":1646746080500,"user_tz":-480,"elapsed":283,"user":{"displayName":"HT Chen","photoUrl":"https://lh3.googleusercontent.com/a/default-user=s64","userId":"17748361917871513601"}},"outputId":"116b6f40-23d6-4b30-ca9f-063066c4a1d8"},"execution_count":null,"outputs":[{"output_type":"stream","name":"stdout","text":["Overwriting E04_07.c\n"]}]},{"cell_type":"code","source":["%%shell\n","gcc E04_07.c -o E04_07\n","./E04_07"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"I5DNPoyJbdxQ","executionInfo":{"status":"ok","timestamp":1646746092029,"user_tz":-480,"elapsed":9103,"user":{"displayName":"HT Chen","photoUrl":"https://lh3.googleusercontent.com/a/default-user=s64","userId":"17748361917871513601"}},"outputId":"b8e86fbd-97b4-47f5-911c-e3d464127c6f"},"execution_count":null,"outputs":[{"output_type":"stream","name":"stdout","text":["3 5 7\n","2 3 4\n","53\n","158\n","263\n","368\n","473\n"]},{"output_type":"execute_result","data":{"text/plain":[""]},"metadata":{},"execution_count":88}]},{"cell_type":"markdown","source":["##Example 1\n","\n","自己用 `getchar()` `putchar()` 寫出 \n","1. `scanf %d` 和 `printf %d`\n","2. `scanf %x` 和 `printf %x`\n","\n","參考 `ctype.h`\n","https://en.wikipedia.org/wiki/C_character_classification\n","\n","整型提升\n","https://zh.wikipedia.org/wiki/%E6%95%B4%E5%9E%8B%E6%8F%90%E5%8D%87"],"metadata":{"id":"dHQBaha-cAUQ"}},{"cell_type":"code","source":["%%writefile E05_01.c\n","#include <stdio.h>\n","#include <string.h>\n","#include <ctype.h>\n","\n","// int:32 bits\n","// short: 16 bits\n","// char: 8 bits\n","// long: 32 bits\n","// long long: 64 bits 整數型態\n","// 二進位表示法是用同樣的邏輯在儲存\n","// 差別在於位元數不同\n","int main(void)\n","{\n","    int c; \n","    int z, u;\n"," \n","    // scanf %d  read a sequence of digits, interpret it as an integer\n","    z = 0;\n","    while ( (c=getchar()) && isdigit(c)) {  //'1' '2' '3' '4'\n","        z = z*10 + c - '0';\n","    }\n","    \n","    // printf %d\n","    u = 1;\n","    while (u <= z) {\n","      u = u * 10;\n","    }\n","    u = u/10; // 找到最靠近 z 的 10 的次方\n","    while (u > 0) { // z=12345 u=10000  z/u==1, z%u==2345  u/10==1000\n","        putchar(z/u + '0');\n","        z = z % u;\n","        u = u / 10;\n","    }\n"," \n","    // scanf %x  read a sequence of digits, interpret it as an integer\n","    z = 0;\n","    while ( (c=getchar()) && isxdigit(c)) {  //'1' '2' '3' '4'\n","        if (isdigit(c)) {\n","          z = z*16 + c - '0';\n","        } else {\n","          z = z*16 + (toupper(c) - 'A' + 10); // 'A'-->10, 'B'-->11, ..., 'F'-->15\n","        }\n","    }\n"," \n"," \n","    // printf %x\n","    u = 1;\n","    while (u <= z) {\n","      u = u * 16;\n","    }\n","    u = u/16; // 找到最靠近 z 的 16 的次方\n","    while (u > 0) { // z=12345 u=10000  z/u==1, z%u==2345  u/10==1000\n","        if (z/u < 10) {\n","           putchar(z/u + '0');\n","        } else {\n","           putchar(z/u-10 + 'A');\n","        }\n","        z = z % u;\n","        u = u / 16;\n","    }\n"," \n","\n","}"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"-idcCj0USzhZ","executionInfo":{"status":"ok","timestamp":1647347204307,"user_tz":-480,"elapsed":247,"user":{"displayName":"HT Chen","photoUrl":"https://lh3.googleusercontent.com/a/default-user=s64","userId":"17748361917871513601"}},"outputId":"59dda397-56bc-419e-eab3-b6e23e016a50"},"execution_count":90,"outputs":[{"output_type":"stream","name":"stdout","text":["Overwriting E05_01.c\n"]}]},{"cell_type":"code","source":["%%shell\n","gcc E05_01.c -o E05_01\n","./E05_01"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"ixZxf1vbTUXY","executionInfo":{"status":"ok","timestamp":1647347256634,"user_tz":-480,"elapsed":12516,"user":{"displayName":"HT Chen","photoUrl":"https://lh3.googleusercontent.com/a/default-user=s64","userId":"17748361917871513601"}},"outputId":"28b32c68-c8fc-4a90-9d0a-68b16ec7e933"},"execution_count":92,"outputs":[{"output_type":"stream","name":"stdout","text":["12345\n","12345a21f\n","41503 a21f\n","41503 A21F"]},{"output_type":"execute_result","data":{"text/plain":[""]},"metadata":{},"execution_count":92}]},{"cell_type":"code","source":["%%writefile E05_01.c\n","#include <stdio.h>\n","#include <string.h>\n","#include <ctype.h>\n","int main(void)\n","{\n","\n","\tint x;\n","\tchar ch;\n","\tchar digits[20];\n","\tint i;\n","\n","\tx = 0;\n","\twhile ((ch=getchar()) != EOF && isdigit(ch)) {\n","\t\tx = x*10+ch-'0';\n","\t}\n","\n","\tx = x*2 ;\n","\n","\ti = 0;\n","\twhile (x>0) {\n","\t\tdigits[i] =  (x%10) + '0';\t\n","\t\tx = x / 10;\n","\t\ti++;\n","\t}\n","\ti--;\n","\twhile (i>=0) {\n","\t\tputchar(digits[i]);\n","\t\tputchar('_');\n","\t\ti--;\n","\t}\n","\n","\treturn 0;\n","}"],"metadata":{"id":"nqroRwrK0nro"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["%%shell\n","gcc E05_01.c -o E05_01\n","./E05_01"],"metadata":{"id":"8WO_46Li02Ct"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":["##Example 2\n","完整的二維陣列範例，模擬一個機器人在地圖中行走。\n","\n","先產生下列三個文字檔，名稱分別是 `jewels.txt` `blocks.txt` `actions.txt`\n","\n","三個檔案中存放的內容分別是寶物的位置、障礙物的位置、以及車子的移動方式\n","\n","jewels.txt 的第一個數字 5 代表總共有 5 個寶物，接下來的 5 筆資料則是寶物的座標（row, column)\n","```\n","5\n","2 5\n","2 7\n","8 8\n","9 5\n","10 4\n","\n","```\n","\n","blocks.txt 的第一個數字代表總共有幾個障礙物，接下來的資料則是障礙物座標\n","```\n","4\n","2 2\n","2 9\n","9 2\n","9 9\n","\n","```\n","\n","actions.txt 包含一個由 `F` 或 `R` 構成的字串，`F` 代表往前走一步，`R` 則代表原地順時鐘旋轉 90 度\n","```\n","FRFFFFFFFFRRFFFFFFFFF\n","\n","```"],"metadata":{"id":"mviKuWaapY32"}},{"cell_type":"code","source":["%%writefile jewels.txt\n","5\n","2 5\n","2 7\n","8 8\n","9 5\n","10 4\n"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"7ZODSFC-pmP2","executionInfo":{"status":"ok","timestamp":1647347991382,"user_tz":-480,"elapsed":261,"user":{"displayName":"HT Chen","photoUrl":"https://lh3.googleusercontent.com/a/default-user=s64","userId":"17748361917871513601"}},"outputId":"5188c581-f972-48d9-a1b4-8a57de8d8a66"},"execution_count":93,"outputs":[{"output_type":"stream","name":"stdout","text":["Overwriting jewels.txt\n"]}]},{"cell_type":"code","source":["%%writefile blocks.txt\n","4\n","2 2\n","2 9\n","9 2\n","9 9\n"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"9v3Fmic7p0_t","executionInfo":{"status":"ok","timestamp":1647348001840,"user_tz":-480,"elapsed":451,"user":{"displayName":"HT Chen","photoUrl":"https://lh3.googleusercontent.com/a/default-user=s64","userId":"17748361917871513601"}},"outputId":"920a2337-4cf2-45c6-9582-db800edc28e7"},"execution_count":94,"outputs":[{"output_type":"stream","name":"stdout","text":["Overwriting blocks.txt\n"]}]},{"cell_type":"code","source":["%%writefile actions.txt\n","FRFFFFFFFFRRFFFFFFFFF\n"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"tDfnu6a-p_sr","executionInfo":{"status":"ok","timestamp":1647348010031,"user_tz":-480,"elapsed":259,"user":{"displayName":"HT Chen","photoUrl":"https://lh3.googleusercontent.com/a/default-user=s64","userId":"17748361917871513601"}},"outputId":"c0150c11-859f-4994-b6cc-edc46375efaa"},"execution_count":95,"outputs":[{"output_type":"stream","name":"stdout","text":["Overwriting actions.txt\n"]}]},{"cell_type":"markdown","source":["先看看下列二維陣列資料\n","以及對陣列作處理的函數\n","```\n","#include <stdio.h>\n","#define MAP_SIZE 12\n","#define CAR_SIZE 3\n","/* #define ONLINE_JUDGE */\n","\n","int map[MAP_SIZE][MAP_SIZE];\n","void map_reset(void);\n","\n","void map_show(void);\n","\n","int blocks[MAP_SIZE][MAP_SIZE];\n","void blocks_read(void);\n","void blocks_put_on_map(void);\n","\n","int jewels[MAP_SIZE][MAP_SIZE];\n","void jewels_read(void);\n","void jewels_put_on_map(void);\n","\n","int car[CAR_SIZE][CAR_SIZE] = {{'O', 'O', '@'}, {'O', 'O', 'O'}, {'O', 'O', '@'}};\n","int car_row = 3, car_col = 4;\n","int car_direction;\n","int car_earnings;\n","void car_rotate90(void);\n","void car_put_on_map(void);\n","void car_move(void);\n","```\n","\n","其中 `/* #define ONLINE_JUDGE */` 如果將註解移除，資料的輸入來源和輸出形式就會針對`ONLINE_JUDGE`。如果保持註解狀態，則可以在自己的電腦上執行。\n","\n","\n","* `map` 是一個二維陣列，用來表示地圖的內容。\n","* `map_reset()` 的作用是清除地圖內容以及重設邊界\n","* `map_show()` 則是把 `map` 的內容顯示到螢幕上\n","\n","\n","`blocks` 也是二維陣列，記錄磚牆的位置，會透過 `blocks_read()` 從檔案 `blocks.txt` 中讀取位置資訊，然後用 `blocks_put_on_map()` 在地圖 `map` 裡面的對應位置放置磚牆。\n","\n","磚牆是固定的，車子前進時如果遇到磚牆會被擋住。\n","`blocks.txt` 的內容如下\n","```\n","4\n","2 2\n","9 9\n","9 2\n","2 9\n","```\n","\n","`jewels` 二維陣列記錄寶物的位置，會藉由 `jewels_read()` 從檔案 `jewels.txt` 中讀取位置資訊，然後用 `jewels_put_on_map()` 在地圖 `map` 裡面的對應位置放置寶物。\n","\n","車子前進時如果遇到寶物就會撿起來。\n","`jewels.txt` 內容如下\n","```\n","5\n","2 5\n","2 7\n","8 8\n","9 5\n","10 4\n","```\n","\n","`car` 二維陣列記錄車子的外觀， `@ @` 表示車頭方向。\n","車子的起始位置是 `(row: 3, column: 4)`，\n","用來記錄車子目前位置的變數是 `car_row 和 car_col`。\n","\n","車子的方向則是由 `car_direction` 表示，\n","我們可以讓可以用 `0, 1, 2, 3` 來分別代表車子朝向 右、下、左、上。\n","所以如果 `car_direction` 的值等於 `2` 表示車子目前朝左。\n","`car_earnings` 則是記錄撿到的寶物數量。\n","\n","需要自行完成的函數是\n","`car_rotate90()` 和 `car_move()`。\n","`car_rotate90()` 要將 `car` 二維陣列順時鐘旋轉 `90` 度，\n","並且更新 `car_direction` 的值，讓它符合目前方向。\n","\n","`car_move()` 則要將 `car` 依照目前方向，向前移動一格。\n","在移動之前必須先判斷是否會被磚牆擋住，\n","也不能超出 `map` 原本的外牆。\n","移動之後，\n","要將碰到的寶物撿起來 (撿走之後就沒了  不能重複撿)。\n","\n","車子的移動是根據 `action.txt` 的指示，\n","只有兩種動作：\n","* `'R'` 代表順時鐘旋轉九十度\n","* `'F'` 代表前進一格\n","做完全部的動作之後，最後要輸出車子目前的狀態。\n","\n","假設輸入的 `action.txt` 內容是\n","```\n","FRFFFFFFFFRRFFFFFFFFF\n","```\n","\n","最後的狀態應該是\n","```\n","HHHHHHHHHHHH\n","H....@O@...H\n","H.#..OOO.#.H\n","H....OOO...H\n","H..........H\n","H..........H\n","H..........H\n","H..........H\n","H.......$..H\n","H.#......#.H\n","H...$......H\n","HHHHHHHHHHHH\n","Earnings: 3\n","Position: row=1, col=5\n","Direction: U\n","```\n","\n","底下是各個函數定義\n","```\n","int main(void)\n","{\n","    int ch;\n","\n","    blocks_read();\n","\n","    jewels_read();\n","\n","#ifndef ONLINE_JUDGE\n","    freopen(\"actions.txt\", \"r\", stdin);\n","#endif\n","\n","    while ((ch=getchar()) != EOF) {\n","\n","        if (ch=='R') {\n","\n","            car_rotate90();\n","        }\n","\n","        if (ch=='F') {\n","\n","            car_move();\n","        }\n","\n","        map_reset();\n","\n","        blocks_put_on_map();\n","\n","        jewels_put_on_map();\n","\n","        car_put_on_map();\n","\n","#ifndef ONLINE_JUDGE\n","        map_show();\n","#endif\n","    }\n","\n","\n","    printf(\"Earnings: %d\\n\", car_earnings);\n","\n","    printf(\"Position: row=%d, col=%d\\n\", car_row, car_col);\n","\n","    char dirs[] = \"RDLU\";\n","\n","    printf(\"Direction: %c\\n\", dirs[car_direction]);\n","\n","\n","    return 0;\n","}\n","void blocks_read(void)\n","{\n","    int n, i;\n","    int row, col;\n","#ifndef ONLINE_JUDGE\n","    freopen(\"blocks.txt\", \"r\", stdin);\n","#endif\n","    scanf(\"%d\", &n);\n","    for (i=0; i<n; i++) {\n","        scanf(\"%d%d\", &row, &col);\n","        blocks[row][col] = 1;\n","    }\n","}\n","void jewels_read(void)\n","{\n","    int n, i;\n","    int row, col;\n","#ifndef ONLINE_JUDGE\n","    freopen(\"jewels.txt\", \"r\", stdin);\n","#endif\n","    scanf(\"%d\", &n);\n","    for (i=0; i<n; i++) {\n","        scanf(\"%d%d\", &row, &col);\n","        jewels[row][col] = 1;\n","    }\n","}\n","void blocks_put_on_map(void)\n","{\n","    int i, j;\n","\n","    for (i=0; i<MAP_SIZE; i++) {\n","\n","        for (j=0; j<MAP_SIZE; j++) {\n","\n","            if (blocks[i][j])\n","\n","                map[i][j] = '#';\n","        }\n","    }\n","}\n","void jewels_put_on_map()\n","{\n","    int i, j;\n","\n","    for (i=0; i<MAP_SIZE; i++) {\n","\n","        for (j=0; j<MAP_SIZE; j++) {\n","\n","            if (jewels[i][j])\n","\n","                map[i][j] = '$';\n","        }\n","    }\n","}\n","void map_reset(void)\n","{\n","    int i, j;\n","\n","    for (i=0; i<MAP_SIZE; i++) {\n","\n","        for (j=0; j<MAP_SIZE; j++) {\n","\n","            map[i][j] = '.';\n","        }\n","    }\n","    for (i=0; i<MAP_SIZE; i++) {\n","\n","        map[i][0] = 'H';\n","\n","        map[i][MAP_SIZE-1] = 'H';\n","    }\n","    for (j=0; j<MAP_SIZE; j++) {\n","\n","        map[0][j] = 'H';\n","\n","        map[MAP_SIZE-1][j] = 'H';\n","    }\n","}\n","\n","void map_show(void)\n","{\n","    int i, j;\n","\n","    for (i=0; i<MAP_SIZE; i++) {\n","\n","        for (j=0; j<MAP_SIZE; j++) {\n","\n","            printf(\"%c\", map[i][j]);\n","\n","        }\n","        printf(\"\\n\");\n","    }\n","\n","}\n","void car_put_on_map(void)\n","{\n","    int i, j;\n","    for (i=0; i<CAR_SIZE; i++) {\n","\n","        for (j=0; j<CAR_SIZE; j++) {\n","\n","            map[i+car_row][j+car_col] = car[i][j];\n","        }\n","    }\n","}\n","\n","void car_rotate90(void)\n","{\n","    /* your code */\n","}\n","\n","void car_move(void)\n","{\n","    /* your code */\n","}\n","```\n","\n","[註]\n","範例程式裡\n","```\n","#ifndef ONLINE_JUDGE\n","freopen(\"jewels.txt\", \"r\", stdin);\n","#endif\n","```\n","和 `#include` 和 `#define` 一樣，都屬於 preprocessor directives，\n","在程式碼被編譯之前會先做的前處理。\n","`#ifndef ONLINE_JUDGE` 的作用是根據 `ONLINE_JUDGE` 是否被定義，\n","決定是否要呼叫\n","```\n","freopen(\"jewels.txt\", \"r\", stdin);\n","```\n","如果沒有被定義就會呼叫。反之，如果已經定義則不呼叫。\n","(`#ifndef` 的字面意思可以想成是 if not defined)\n","\n","這個技巧對於做 online judge 題目很有用。我們可以先將標準鍵盤輸入 `stdin` 導向為文字檔，\n","文字檔裡面先填好要測試的資料，這樣就不用每次都重複輸入。\n","等到真的要上傳的時候，就把程式碼最開頭的  `/* #define ONLINE_JUDGE */`\n","註解去掉變成，\n","```\n","#define ONLINE_JUDGE\n","```\n","這樣由於 `ONLINE_JUDGE` 被定義了，所以 `ifndef` 條件不成立，不會呼叫 `freopen()`，\n","標準輸入 `stdin` 的來源就會交給 Online Judge 系統決定。\n","\n","\n","###底下是完整的程式碼。"],"metadata":{"id":"UFsXAkJi7ojs"}},{"cell_type":"code","source":["%%writefile E05_02.c\n","\n","#include <stdio.h>\n","#define MAP_SIZE 12\n","#define CAR_SIZE 3\n","\n","//#define ONLINE_JUDGE \n","\n","int map[MAP_SIZE][MAP_SIZE];\n","void map_reset(void);\n","void map_show(void);\n","\n","int blocks[MAP_SIZE][MAP_SIZE];\n","void blocks_read(void);\n","void blocks_put_on_map(void);\n","\n","int jewels[MAP_SIZE][MAP_SIZE];\n","void jewels_read(void);\n","void jewels_put_on_map(void);\n","\n","int car[CAR_SIZE][CAR_SIZE] = {{'O', 'O', '@'}, {'O', 'O', 'O'}, {'O', 'O', '@'}};\n","int car_row = 3, car_col = 4;\n","int car_direction = 0;\n","int car_earnings = 0;\n","void car_rotate90(void);\n","void car_put_on_map(void);\n","void car_move(void);\n","\n","\n","int main(void)\n","{\n","\tchar dir[] = {'R', 'D', 'L', 'U'};\n","\tchar ch;\n","\tblocks_read();\n","\tjewels_read();\n","\n","\tmap_reset();\n","\tblocks_put_on_map();\n","\tjewels_put_on_map();\n","\tcar_put_on_map();\n","\tmap_show();\n","\n","  #ifndef ONLINE_JUDGE\t\n","\tfreopen(\"actions.txt\", \"r\", stdin);\n","  #endif\n","\twhile( (ch=getchar()) != EOF ) {\n","\t\tmap_reset();\n","\n","\t\tif (ch=='F') car_move();\n","\t\telse if (ch=='R') car_rotate90();\n","\t\telse {}\n","\n","\t\tblocks_put_on_map();\n","\t\tjewels_put_on_map();\n","\t\tcar_put_on_map();\n","\t\tmap_show();\n","\t}\t\n","\n","\tprintf(\"Earnings: %d\\n\", car_earnings);\n","\tprintf(\"Position: row=%d, col=%d\\n\",\n","\t\t       \tcar_row, car_col);\n","\tprintf(\"Direction: %c\\n\", dir[car_direction]);\n","\n","    \treturn 0;\n","}\n","\n","void map_reset(void)\n","{\n","\tint i, j;\n","\tfor (i=0; i<MAP_SIZE; i++) {\n","\t\tfor (j=0; j<MAP_SIZE; j++) {\n","\t\t\tmap[i][j] = '.';\n","\t\t}\n","\t}\n","\tfor (i=0; i<MAP_SIZE; i++) {\n","\t\tmap[0][i] = map[i][0] =\n","\t\t       \tmap[i][MAP_SIZE-1] = \n","\t\t\tmap[MAP_SIZE-1][i] = 'H';\n","\t}\n","\n","}\n","\n","void map_show(void)\n","{\n","\tint i, j;\n","\tfor (i=0; i<MAP_SIZE; i++) {\n","\t\tfor (j=0; j<MAP_SIZE; j++) {\n","\t\t\tputchar(map[i][j]);\n","\t\t}\n","\t\tputchar('\\n');\n","\t}\n","}\n","\n","void blocks_read(void)\n","{\n","\tint n, r, c;\n","  #ifndef ONLINE_JUDGE\n","\tfreopen(\"blocks.txt\", \"r\", stdin);\n","  #endif\n","\tscanf(\"%d\", &n);\n","\twhile (n>0) {\n","\t\tscanf(\"%d%d\", &r, &c);\n","\t\tblocks[r][c] = 1;\n","\t\tn--;\n","\t}\n","}\n","\n","void blocks_put_on_map(void)\n","{\n","\tint i, j;\n","\tfor (i=0; i<MAP_SIZE; i++) {\n","\t\tfor (j=0; j<MAP_SIZE; j++) {\n","\t\t\tif (blocks[i][j]==1) {\n","\t\t\t\tmap[i][j] = '#';\n","\t\t\t}\n","\t\t}\n","\t}\n","}\n","\n","void jewels_read(void)\n","{\n","\tint n, r, c;\n","  #ifndef ONLINE_JUDGE\n","\tfreopen(\"jewels.txt\", \"r\", stdin);\n","  #endif\n","\tscanf(\"%d\", &n);\n","\twhile (n>0) {\n","\t\tscanf(\"%d%d\", &r, &c);\n","\t\tjewels[r][c]++ ;\n","\t\tn--;\n","\t}\n","}\n","\n","void jewels_put_on_map(void)\n","{\n","\tint i, j;\n","\tfor (i=0; i<MAP_SIZE; i++) {\n","\t\tfor (j=0; j<MAP_SIZE; j++) {\n","\t\t\tif (jewels[i][j]>0) {\n","\t\t\t\tmap[i][j] = '$';\n","\t\t\t}\n","\t\t}\n","\t}\n","}\n","\n","void car_put_on_map(void)\n","{\n","\tint i, j;\n","\tfor (i=0; i<CAR_SIZE; i++) {\n","\t\tfor (j=0; j<CAR_SIZE; j++) {\n","\t\t\tmap[car_row+i][car_col+j] \n","\t\t\t\t= car[i][j];\n","\t\t}\n","\t}\n","}\n","\n","void car_move(void)\n","{\n","\tint i, j, valid;\n","\tint car_row_n;\n","\tint car_col_n;\n","\tint diff_r[4] = {0, 1, 0, -1};\n","\tint diff_c[4] = {1, 0, -1, 0};\n","\n","\tprintf(\"move forward\\n\");\n","\tcar_row_n = car_row + diff_r[car_direction];\n","\tcar_col_n = car_col + diff_c[car_direction];\n","\n","\n","\tvalid = 1;\n","\tfor (i=0; i<CAR_SIZE; i++) {\n","\t\tfor (j=0; j<CAR_SIZE; j++) {\n","\t\t\tif (blocks[car_row_n+i][car_col_n+j]!=0\n","\t\t\t|| map[car_row_n+i][car_col_n+j]!='.') \n","\t\t\t\tvalid=0;\n","\t\t}\n","\t}\n","\tif (valid) {\n","\t\tcar_row = car_row_n;\n","\t\tcar_col = car_col_n;\n","\t}\n","\n","\tfor (i=0; i<CAR_SIZE; i++) {\n","\t\tfor (j=0; j<CAR_SIZE; j++) {\n","\t\t\tif (jewels[car_row+i][car_col+j]>0){\n","\t\t\tjewels[car_row+i][car_col+j]--;\n","\t\t\tcar_earnings++;\n","\t\t\t}\n","\t\t}\n","\t}\n","\t\n","}\n","\n","void car_rotate90(void)\n","{\n","  int tmp;\n","  if (car_direction%2) {\n","      tmp = car[0][0];\n","      car[0][0] = car[2][2];\n","      car[2][2] = tmp;\n","  } else {\n","      tmp = car[0][2];\n","      car[0][2] = car[2][0];\n","      car[2][0] = tmp;      \n","  }\n","\tfor (i=0; i<CAR_SIZE; i++) {\n","\t\tfor (j=0; j<CAR_SIZE; j++) {\n","\t\t\tif (jewels[car_row+i][car_col+j]>0){\n","\t\t\tjewels[car_row+i][car_col+j]--;\n","\t\t\tcar_earnings++;\n","\t\t\t}\n","\t\t}\n","\t  \n","\tcar_direction = (car_direction+1)%4;\n","}\n"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"ACJsHTcE5Hks","executionInfo":{"status":"ok","timestamp":1647351105806,"user_tz":-480,"elapsed":311,"user":{"displayName":"HT Chen","photoUrl":"https://lh3.googleusercontent.com/a/default-user=s64","userId":"17748361917871513601"}},"outputId":"7b0d54f4-ed7a-4348-c4c0-c4209f93d5ea"},"execution_count":100,"outputs":[{"output_type":"stream","name":"stdout","text":["Overwriting E05_02.c\n"]}]},{"cell_type":"code","source":["%%shell\n","gcc E05_02.c -o E05_02\n","./E05_02"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"HMqFdYymQIzj","executionInfo":{"status":"ok","timestamp":1647351115661,"user_tz":-480,"elapsed":241,"user":{"displayName":"HT Chen","photoUrl":"https://lh3.googleusercontent.com/a/default-user=s64","userId":"17748361917871513601"}},"outputId":"4cae2aa7-2c90-4c6f-a539-066181beb9ee"},"execution_count":101,"outputs":[{"output_type":"stream","name":"stdout","text":["HHHHHHHHHHHH\n","H..........H\n","H.#..$.$.#.H\n","H...OO@....H\n","H...OOO....H\n","H...OO@....H\n","H..........H\n","H..........H\n","H.......$..H\n","H.#..$...#.H\n","H...$......H\n","HHHHHHHHHHHH\n","move forward\n","HHHHHHHHHHHH\n","H..........H\n","H.#..$.$.#.H\n","H....OO@...H\n","H....OOO...H\n","H....OO@...H\n","H..........H\n","H..........H\n","H.......$..H\n","H.#..$...#.H\n","H...$......H\n","HHHHHHHHHHHH\n","HHHHHHHHHHHH\n","H..........H\n","H.#..$.$.#.H\n","H....OOO...H\n","H....OOO...H\n","H....@O@...H\n","H..........H\n","H..........H\n","H.......$..H\n","H.#..$...#.H\n","H...$......H\n","HHHHHHHHHHHH\n","move forward\n","HHHHHHHHHHHH\n","H..........H\n","H.#..$.$.#.H\n","H..........H\n","H....OOO...H\n","H....OOO...H\n","H....@O@...H\n","H..........H\n","H.......$..H\n","H.#..$...#.H\n","H...$......H\n","HHHHHHHHHHHH\n","move forward\n","HHHHHHHHHHHH\n","H..........H\n","H.#..$.$.#.H\n","H..........H\n","H..........H\n","H....OOO...H\n","H....OOO...H\n","H....@O@...H\n","H.......$..H\n","H.#..$...#.H\n","H...$......H\n","HHHHHHHHHHHH\n","move forward\n","HHHHHHHHHHHH\n","H..........H\n","H.#..$.$.#.H\n","H..........H\n","H..........H\n","H..........H\n","H....OOO...H\n","H....OOO...H\n","H....@O@$..H\n","H.#..$...#.H\n","H...$......H\n","HHHHHHHHHHHH\n","move forward\n","HHHHHHHHHHHH\n","H..........H\n","H.#..$.$.#.H\n","H..........H\n","H..........H\n","H..........H\n","H..........H\n","H....OOO...H\n","H....OOO$..H\n","H.#..@O@.#.H\n","H...$......H\n","HHHHHHHHHHHH\n","move forward\n","HHHHHHHHHHHH\n","H..........H\n","H.#..$.$.#.H\n","H..........H\n","H..........H\n","H..........H\n","H..........H\n","H..........H\n","H....OOO$..H\n","H.#..OOO.#.H\n","H...$@O@...H\n","HHHHHHHHHHHH\n","move forward\n","HHHHHHHHHHHH\n","H..........H\n","H.#..$.$.#.H\n","H..........H\n","H..........H\n","H..........H\n","H..........H\n","H..........H\n","H....OOO$..H\n","H.#..OOO.#.H\n","H...$@O@...H\n","HHHHHHHHHHHH\n","move forward\n","HHHHHHHHHHHH\n","H..........H\n","H.#..$.$.#.H\n","H..........H\n","H..........H\n","H..........H\n","H..........H\n","H..........H\n","H....OOO$..H\n","H.#..OOO.#.H\n","H...$@O@...H\n","HHHHHHHHHHHH\n","move forward\n","HHHHHHHHHHHH\n","H..........H\n","H.#..$.$.#.H\n","H..........H\n","H..........H\n","H..........H\n","H..........H\n","H..........H\n","H....OOO$..H\n","H.#..OOO.#.H\n","H...$@O@...H\n","HHHHHHHHHHHH\n","HHHHHHHHHHHH\n","H..........H\n","H.#..$.$.#.H\n","H..........H\n","H..........H\n","H..........H\n","H..........H\n","H..........H\n","H....@OO$..H\n","H.#..OOO.#.H\n","H...$@OO...H\n","HHHHHHHHHHHH\n","HHHHHHHHHHHH\n","H..........H\n","H.#..$.$.#.H\n","H..........H\n","H..........H\n","H..........H\n","H..........H\n","H..........H\n","H....@O@$..H\n","H.#..OOO.#.H\n","H...$OOO...H\n","HHHHHHHHHHHH\n","move forward\n","HHHHHHHHHHHH\n","H..........H\n","H.#..$.$.#.H\n","H..........H\n","H..........H\n","H..........H\n","H..........H\n","H....@O@...H\n","H....OOO$..H\n","H.#..OOO.#.H\n","H...$......H\n","HHHHHHHHHHHH\n","move forward\n","HHHHHHHHHHHH\n","H..........H\n","H.#..$.$.#.H\n","H..........H\n","H..........H\n","H..........H\n","H....@O@...H\n","H....OOO...H\n","H....OOO$..H\n","H.#......#.H\n","H...$......H\n","HHHHHHHHHHHH\n","move forward\n","HHHHHHHHHHHH\n","H..........H\n","H.#..$.$.#.H\n","H..........H\n","H..........H\n","H....@O@...H\n","H....OOO...H\n","H....OOO...H\n","H.......$..H\n","H.#......#.H\n","H...$......H\n","HHHHHHHHHHHH\n","move forward\n","HHHHHHHHHHHH\n","H..........H\n","H.#..$.$.#.H\n","H..........H\n","H....@O@...H\n","H....OOO...H\n","H....OOO...H\n","H..........H\n","H.......$..H\n","H.#......#.H\n","H...$......H\n","HHHHHHHHHHHH\n","move forward\n","HHHHHHHHHHHH\n","H..........H\n","H.#..$.$.#.H\n","H....@O@...H\n","H....OOO...H\n","H....OOO...H\n","H..........H\n","H..........H\n","H.......$..H\n","H.#......#.H\n","H...$......H\n","HHHHHHHHHHHH\n","move forward\n","HHHHHHHHHHHH\n","H..........H\n","H.#..@O@.#.H\n","H....OOO...H\n","H....OOO...H\n","H..........H\n","H..........H\n","H..........H\n","H.......$..H\n","H.#......#.H\n","H...$......H\n","HHHHHHHHHHHH\n","move forward\n","HHHHHHHHHHHH\n","H....@O@...H\n","H.#..OOO.#.H\n","H....OOO...H\n","H..........H\n","H..........H\n","H..........H\n","H..........H\n","H.......$..H\n","H.#......#.H\n","H...$......H\n","HHHHHHHHHHHH\n","move forward\n","HHHHHHHHHHHH\n","H....@O@...H\n","H.#..OOO.#.H\n","H....OOO...H\n","H..........H\n","H..........H\n","H..........H\n","H..........H\n","H.......$..H\n","H.#......#.H\n","H...$......H\n","HHHHHHHHHHHH\n","move forward\n","HHHHHHHHHHHH\n","H....@O@...H\n","H.#..OOO.#.H\n","H....OOO...H\n","H..........H\n","H..........H\n","H..........H\n","H..........H\n","H.......$..H\n","H.#......#.H\n","H...$......H\n","HHHHHHHHHHHH\n","Earnings: 3\n","Position: row=1, col=5\n","Direction: U\n"]},{"output_type":"execute_result","data":{"text/plain":[""]},"metadata":{},"execution_count":101}]}]}