題目說明#
給一個二維平面,座標如同數學的二維座標( 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;
}
