# Greedy# Simulation# Direction

k731 - 1. 路徑偵測

🔗 前往 ZeroJudge 原題

題目描述

題目給定一系列的二維平面座標,模擬從 (0, 0) 開始的移動路徑。每次移動只能是水平或垂直方向,且相鄰點的座標差值不大於 100。目標是計算路徑中左轉、右轉和迴轉的次數。

解題思路

這題可以使用貪心策略和模擬的方法來解決。我們從起始位置 (0, 0) 開始,並記錄當前的方向(初始方向為向右)。對於每個給定的座標點,我們根據該點與前一個點的相對位置來判斷轉彎的方向。

  • 如果 x 座標增加,表示繼續向右移動。
  • 如果 x 座標減少,表示向左移動。
  • 如果 y 座標增加,表示向上移動。
  • 如果 y 座標減少,表示向下移動。

根據當前方向和新的方向,我們可以判斷轉彎的類型:

  • 如果方向改變了 90 度,則為左轉或右轉。
  • 如果方向改變了 180 度,則為迴轉。

程式碼中 w 變數代表當前方向,0 代表上,1 代表下,2 代表左,3 代表右。程式會迭代每個座標點,計算轉彎的次數,並更新當前方向。

複雜度分析

  • 時間複雜度: O(n),其中 n 是座標點的數量。因為程式需要迭代每個座標點一次。
  • 空間複雜度: O(1),因為程式只使用了幾個常數大小的變數來存儲狀態。

程式碼

#include <iostream>
using namespace std;
int n,x,y,r,l,b,w=3,lx,ly;
int main(){
	cin >> n;
	for(int i=0;i<n;++i){
		cin >> x >> y;
		int nw;
		if(x>lx)nw=3;
		else if(x<lx)nw=2;
		else if(y>ly)nw=0;
		else nw=1;
		if(w==0){//u
			if(nw==1)++b;
			else if(nw==2)++l;
			else if(nw==3)++r;
		}
		else if(w==1){//d
			if(nw==0)++b;
			else if(nw==2)++r;
			else if(nw==3)++l;
		}
		else if(w==2){//l
			if(nw==1)++l;
			else if(nw==0)++r;
			else if(nw==3)++b;
		}
		else{//r
			if(nw==1)++r;
			else if(nw==2)++b;
			else if(nw==0)++l;
		}
		w=nw;
		lx=x;
		ly=y;
	} 
	cout << l << ' ' << r << " " << b;
}

Discussion