開啟章節選單
路徑偵測
題目說明
給一個二維平面,座標如同數學的二維座標( 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; }