2014-12-15 3 views
3
#include <iostream> 
using namespace std; 
int main (int argc, char ** argv) 
{ 
    int c; 
    int distance=0; 
    int largestdistance=0; 
    int sum=0; 
    cin >> c; 
    int point[c][2]; 
    for (int i=0; i<c; i++){ 
     for (int j=0; j<2; j++){ 
      cin >> point[i][j]; 
     } 
    } 
    cout << point[2][0] << " "; 
    for (int i=0; i<c; i++){ 
     for (int j=0; j<2; j++){ 
      sum += abs(point[0][0]-point[1][0])+abs(point[0][1]-point[1][1]); 
     } 
     if (sum > largestdistance){ 
      largestdistance=sum; 
     } 
     cout << '\n'; 
     return 0; 
    } 
} 

이 프로그램은 첫 번째 행의 첫 번째 값에서 두 번째 행을 뺀 값의 첫 번째 값의 절대 값을 두 번째 행의 절대 값에 더한 값을 출력합니다 번호에서 두 번째 행의 두 번째 숫자를 뺀 값입니다. 나는 모든 프로그램이 자동으로 sum += abs(point[0][0]-point[1][0])+abs(point[0][1]-point[1][1])point[][]sum += abs(point[c-1][0]-point[c][0])+abs(point[c-1][1]-point[c][1])까지 진행되도록 프로그램을 만드는 방법을 궁금해했다. 당신은 소수점 형 도입 된 경우가 많은 명확 것2D 배열에서 두 점의 차이를 얻는 방법

답변

2

: 그와

struct Point { 
    int x, y; 
}; 

int manhattan_dist(const Point& p, const Point& q) { 
    return abs(p.x - q.x) + abs(p.y - q.y); 
} 

무장, 그것은 루프 훨씬 쉽게 :

int sum = 0; 
for (int i = 0; i < c - 1; ++i) { // stop before c-1, so i and i+1 are valid 
    sum += manhattan_dist(points[i], points[i+1]); 
} 

Btw는 int point[c][2];는 비표준 코드 때문이다 c은 컴파일 타임 상수가 아닙니다. 바람직하게는

Point* points = new Point[c]; 

또는 :

std::vector<Point> points(c); 
+0

그럼 동적 프로그램 작업을 할 수있는 배열을 할당해야하거나 선택적 않는 동적 배열을 할당해야합니까? @Barry –

+0

@SeanChen 귀하의 컴파일러 *가 당신을 그렇게 할 수도 있습니다. 그러나 비 C++ 11 기능 (VLA는 C 용)에 의존하지 않는 것이 좋습니다. 그냥 동적으로 메모리를 할당하십시오. – Barry

+0

음,하지만 C++ 11이 아닌 정말 오래된 버전의 C++을 사용하고 있습니다. 그렇게 할 수 없을 수도 있습니다. –