438

銀河系を征服してみせる!

Wu-Jun Pei@Sprout2018

SOP

1. 處理輸入輸出

int N, M, l, w, Q;
std::cin >> N >> M >> l >> w >> Q;

2. 初始化一些東西

參考程式碼在下一頁

  • 我的x是往下長的,Spacecraft_x記的是船的x座標

  • 我的y是往右長的,Spacecraft_y記的是船的y座標

  • (Spacecraft_x, Spacecraft_y) 其實代表的就是船左上角的座標位置

2. 初始化一些東西

int Spacecraft_x = 1, Spacecraft_y = 1;

// Set the wall with value -1
for (int i = 0; i <= N + 1; i++) {
    mp[i][0] = mp[i][M + 1] = -1;
}
for (int j = 0; j <= M + 1; j++) {
    mp[0][j] = mp[N + 1][j] = -1;
}

3. 操作

什麼時候要動?什麼時候不用動?不用動:

  • 操作指令不存在(e.g. 7)

  • 碰到邊界:

    以上下(x坐標系)為例:

    如果上面已經到頂了(x == 1),就不能繼續往上走。

    下面比較麻煩些(x + l == N v.s. x + l - 1 == N),小心那個1的問題。

3. 操作

    動:

if (command == 0) {
    if (Spacecraft_x > 1){
        Spacecraft_x --;
    }
} else if (command == 2) {
    if (Spacecraft_x < N - l + 1) {
        Spacecraft_x ++;
    }
}

4. 看成果

把太空船塞進去

一開始把地圖的邊緣弄好了,現在弄中間

for (int i = 1; i <= N; i++) {
    for (int j = 1; j <= M; j++) {
        // Set the spacecraft with value 1
        if (Spacecraft_x <= i && i < Spacecraft_x + l 
            && Spacecraft_y <= j && j <= Spacecraft_y + w) {
            mp[i][j] = 1;
        } else {
            mp[i][j] = 0;
        }
    }
}

4. 印出來

// Print the map
for (int i = 0; i <= N + 1; i++) {
    for (int j = 0; j <= M + 1; j++) {
        if (mp[i][j] == -1) {
            std::cout << '#';
        } else if (mp[i][j] == 0) {
            std::cout << ' ';
        } else if (mp[i][j] == 1) {
            std::cout << 'S';
        }
    }
    std::cout << std::endl;
}

參考程式碼 1: [Click Me]

聰明的你可能發現這題不需要二維陣列!

參考程式碼 2: [Click Me](沒使用陣列

[Sprout2018] Solution to 438

By Wu-Jun Pei

[Sprout2018] Solution to 438

  • 29