路徑偵測

題目說明

給一個二維平面,座標如同數學的二維座標( Y 正為北, X 正為東)。起始位置在 (0, 0),接下來會有 個座標,你需要按照這些座標點的順序移動,保證僅會垂直或水平方向上移動,不會斜向移動,且第一個點保證一定是 X 軸正的位置(初始方向向右)。

請輸出這條路徑中,左轉、右轉、迴轉的個數分別為多少。

解題過程

首先宣告 n xb yb xa ya xv yv left right back pos 這幾個變數

    int n,xb,yb,xa,ya,xv,yv,left=0,right=0,back=0,pos=1; // pos 1右 2上 3左 4下   b 代表前面的座標 a 代表後面的座標 v 代表向量

接著,先輸入有幾個數字及最一開始的座標

  cin >> n >> xb >> yb;

接著要處理後面的座標,這邊要使用上for迴圈來幫助我們,要注意的是這邊for迴圈從 1 開始 n-1 結束,這樣就會剛剛好處理完 n 個座標(共有 n-1 個向量產生)

    for(int i=1;i<=n-1;i++){
  }

在迴圈的一開始,要先輸入後面的座標及算出兩點的向量

  cin >> xa >> ya;
  xv = (xa-xb);
  yv = (ya-yb);

算出兩點向量之後就是要判斷往哪邊轉了,如果算出來的向量是往 +x 方向移動,如果原先面向 +x 方向,那麼不用轉,如果面向 +y 方向,那麼要右轉,如果面向 -x 方向,那麼要迴轉,如果面向 -y 方向,那麼要左轉,故程式碼可以這樣寫

if (xv > 0 && yv == 0){ // 向量是往 +x 方向移動
    if (pos == 1){ // 面向 +x 方向
        xb = xa;
        yb = ya;
        pos = 1;
    }else if (pos == 2){ // 面向 +y 方向
        right++;
        xb = xa;
        yb = ya;
        pos = 1;
    }else if (pos == 3){ // 面向 -x 方向
        back++;
        xb = xa;
        yb = ya;
        pos = 1;
    }else if (pos == 4){ // 面向 -y 方向
        left++;
        xb = xa;
        yb = ya;
        pos = 1;
    }
}

由此類推,可以將向量走向 +y -x -y 的程式碼寫出來,而這邊會用到else if來判斷

else if(xv == 0 && yv > 0){ // 向量向 +y 方向
    if(pos == 1){
        left++;
        xb = xa;
        yb = ya;
        pos = 2;
    }else if(pos == 2){
        xb = xa;
        yb = ya;
        pos = 2;
    }else if(pos == 3){
        right++;
        xb = xa;
        yb = ya;
        pos = 2;
    }else if(pos == 4){
        back++;
        xb = xa;
        yb = ya;
        pos = 2;
    }
}else if(xv < 0 && yv ==0){ // 向量向 -x 方向
    if(pos == 1){
        back++;
        xb = xa;
        yb = ya;
        pos = 3;
    }else if(pos == 2){
        left++;
        xb = xa;
        yb = ya;
        pos = 3;
    }else if(pos == 3){
        xb = xa;
        yb = ya;
        pos = 3;
    }else if(pos == 4){
        right++;
        xb = xa;
        yb = ya;
        pos = 3;
    }
}else if(xv == 0 && yv < 0){ //// 向量向 -y 方向
    if(pos == 1){
        right++;
        xb = xa;
        yb = ya;
        pos = 4;
    }else if(pos == 2){
        back++;
        xb = xa;
        yb = ya;
        pos = 4;
    }else if(pos == 3){
        left++;
        xb = xa;
        yb = ya;
        pos = 4;
    }else if(pos == 4){
        xb = xa;
        yb = ya;
        pos = 4;
    }
}

最後,依照題目的要求將答案輸出即可

    cout << left << " " << right << " " << back;

完整程式碼如下

#include <iostream>
using namespace std;
int main(){
    int n,xb,yb,xa,ya,xv,yv,left=0,right=0,back=0,pos=1; // pos 1右 2上 3左 4下
    cin >> n >> xb >> yb;
    for(int i=1;i<=n-1;i++){
        cin >> xa >> ya;
        xv = (xa-xb);
        yv = (ya-yb);
        if(xv>0 && yv == 0){ 
            if(pos == 1){
                xb = xa;
                yb = ya;
                pos = 1;
            }else if(pos == 2){
                right++;
                xb = xa;
                yb = ya;
                pos = 1;
            }else if(pos == 3){
                back++;
                xb = xa;
                yb = ya;
                pos = 1;
            }else if(pos == 4){
                left++;
                xb = xa;
                yb = ya;
                pos = 1;
            }
        }else if(xv == 0 && yv > 0){
            if(pos == 1){
                left++;
                xb = xa;
                yb = ya;
                pos = 2;
            }else if(pos == 2){
                xb = xa;
                yb = ya;
                pos = 2;
            }else if(pos == 3){
                right++;
                xb = xa;
                yb = ya;
                pos = 2;
            }else if(pos == 4){
                back++;
                xb = xa;
                yb = ya;
                pos = 2;
            }
        }else if(xv < 0 && yv ==0){
            if(pos == 1){
                back++;
                xb = xa;
                yb = ya;
                pos = 3;
            }else if(pos == 2){
                left++;
                xb = xa;
                yb = ya;
                pos = 3;
            }else if(pos == 3){
                xb = xa;
                yb = ya;
                pos = 3;
            }else if(pos == 4){
                right++;
                xb = xa;
                yb = ya;
                pos = 3;
            }
        }else if(xv == 0 && yv < 0){
            if(pos == 1){
                right++;
                xb = xa;
                yb = ya;
                pos = 4;
            }else if(pos == 2){
                back++;
                xb = xa;
                yb = ya;
                pos = 4;
            }else if(pos == 3){
                left++;
                xb = xa;
                yb = ya;
                pos = 4;
            }else if(pos == 4){
                xb = xa;
                yb = ya;
                pos = 4;
            }
        }
    }
    cout << left << " " << right << " " << back;
}