문제

나는 Euler 문제를 해결하려고 노력하고 있습니다 18-> http://projecteuler.net/index.php?section=problems&id=18

나는 c ++로 이것을하려고 노력하고있다 (나는 그것을 다시 배우고 있으며, euler 문제는 좋은 학습/검색 자료를 위해 만든다)

#include <iostream>

using namespace std;

long long unsigned countNums(short,short,short array[][15],short,bool,bool);

int main(int argc,char **argv) {

    long long unsigned max = 0;
    long long unsigned sum;


    short piramide[][15] = {{75,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
                            {95,64,0,0,0,0,0,0,0,0,0,0,0,0,0},
                            {17,47,82,0,0,0,0,0,0,0,0,0,0,0,0},
                            {18,35,87,10,0,0,0,0,0,0,0,0,0,0,0},
                            {20,4,82,47,65,0,0,0,0,0,0,0,0,0,0},
                            {19,1,23,75,3,34,0,0,0,0,0,0,0,0,0},
                            {88,2,77,73,7,63,67,0,0,0,0,0,0,0,0},
                            {99,65,4 ,28,6,16,70,92,0,0,0,0,0,0,0},
                            {41,41,26,56,83,40,80,70,33,0,0,0,0,0,0},
                            {41,48,72,33,47,32,37,16,94,29,0,0,0,0,0},
                            {53,71,44,65,25,43,91,52,97,51,14,0,0,0,0},
                            {70,11,33,28,77,73,17,78,39,68,17,57,0,0,0},
                            {91,71,52,38,17,14,91,43,58,50,27,29,48,0,0},
                            {63,66,4,68,89,53,67,30,73,16,69,87,40,31,0},
                            {4,62,98,27,23,9,70,98,73,93,38,53,60,4,23}};

    for (short i = 0;i<15;i++) {
        for (short m=0;m<15;m++) {
            if (piramide[i][m] == 0)
                break;
            sum = countNums(i,m,piramide,15,true,true);
            if (sum > max)
                max = sum;
            sum = countNums(i,m,piramide,15,true,false);
            if (sum > max)
                max = sum;
            sum = countNums(i,m,piramide,15,false,true);
            if (sum > max)
                max = sum;
            sum = countNums(i,m,piramide,15,false,false);
            if (sum > max)
               max = sum;

        }

    }
    cout << max;
    return 0;
}


long long unsigned countNums(short start_x,short start_y,short array[][15],short size, bool goright,bool goright2) {
    long long unsigned currentSum;

    currentSum = array[start_x][start_y];

    if (goright) { //go right
        if ((start_x + 1) < size)
            start_x++;
        if ((start_y + 1) < size)
            start_y++;
    }
    else //go down
        if ((start_x + 1) < size)
            start_x++;

    if (goright2) { //still going right
        for (short i = start_x, m = start_y;i< size && m < size;i++,m++) {
            currentSum += array[i][m];         
        }
    }
    else { //still going down
        for (short i = start_x;i<size;i++) {
            currentSum += array[i][start_y];            
        }
    }

    return currentSum;
}

Countnums 함수는 아래로 또는 대각선으로 이동하는 데 사용됩니다. 이 기능을 다음과 같이 테스트했습니다.

short a = 0;
short b = 0;
cout << countNums(a,b,piramide,15,true,true) << endl;
cout << countNums(a,b,piramide,15,true,false) << endl;
cout << countNums(a,b,piramide,15,false,true) << endl;
cout << countNums(a,b,piramide,15,false,false) << endl;
return 0;

그리고 그것은 작동합니다 (또한 기능을 조금 변경하여 겪고있는 모든 숫자를 인쇄 할 수 있습니다).

그러나 나는 여전히 올바른 결과를 얻지 못합니다. 이것은 내려 가서 오른쪽으로 내려가 오른쪽으로 가고 (오른쪽에 인접한 숫자), 내려 가서 계속 내려갑니다 (왼쪽의 인접한 숫자). 내가 여기서 뭘 잘못하고 있는가?


Alastair : 간단합니다

긴 서명되지 않은 카운트 넘 (짧은 start_x, 짧은 start_y, 짧은 배열 [] [15], 짧은 크기, bool goright, bool goright2);

start_x and start_y는 배열 배열의 코디는 배열 크기에 대한 참조는 배열의 크기에 불과합니다 (항상 15) Goright는 내가 아래로 내려갈 것인지 또는 오른쪽으로 내려갈 것인지 알아야합니다. Goright2는 나는 계속 내려 가거나 떠날 것입니다

도움이 되었습니까?

해결책

좋아, 먼저, 나는 당신이 문제가 무엇인지에 대해 조금 불분명합니다. 나는 그 두 번째 라이트 문장을 전혀 구문 분석 할 수 없습니다 ...

둘째, 여기서 디자인을 다시 생각할 수 있습니다. 단일 이산 작업을 수행하고 나머지 애플리케이션과 얽혀 있지 않은 기능에 대해 생각해보십시오 (즉, "단단히 결합하고 느슨하게 바인딩된다"). 저에게 큰 경고 종은 여기에 지나치게 게네릭 기능 이름이 있습니다. countNums 논쟁의 긴 목록으로.

문제를 더 작고 쉽게 이해하기 쉬운 덩어리로 나누면 문제를 훨씬 쉽게 찾을 수 있다고 생각합니다. 나는 내가 여기서 가져갈 접근법을 알고 있지만 운동의 요점은 당신이 당신의 프로그래밍 기술을 연습하는 데 도움이되는 것이라고 가정하고 있습니다.

다른 팁

이 문제를 해결했습니다. Project Euler의 본질을 감안할 때 자신의 문제를 스스로 해결하는 것입니다 ( "해결 된 크로스 워드 퍼즐을 정리하는 것은 당신이 그것을 해결했다는 의미는 아닙니다") 다른 사람을 위해 이것을 망치고 싶지 않다는 것입니다. 솔루션이 지나치게 복잡해 보입니다.

그러나 파일을 읽을 때이 문제를 해결할 수 있습니다. 이런 식으로 해결하면 문제 #69가 바람이 될 것입니다!

행운을 빕니다!

나는 문제에 약간 혼란스러워 ..
코드를 정리하면서 시작하겠습니다.

long long unsigned countNums(short x,
                             short y,
                             short array[][15],
                             short size, 
                             bool goright,
                             bool goright2) 
{
    long long unsigned currentSum;
    currentSum = array[x][y];

    if ((x + 1) < size)    x++; //this happened in both your if cases

    if (goright && ((y + 1) < size)      y++; 

    if (goright2)
    { 
        for (;x< size && y< size;x++,y++)
            currentSum += array[x][y];         

    }
    else 
    {
        for (;x<size;x++) 
            currentSum += array[x][y];            
    }
    return currentSum;
 }

이제 나는 질문을 읽었고 그것이 당신이 원하는 것을하고 있는지 확실하지 않습니다. 이것이 당신이 원하는 것이 아니기 때문에 Psudo 코드를 먼저 제안합니다. 코드를 잊어 버리십시오 .. Sudo 코드의 답은 무엇입니까?
오, 그리고 거룩한 모든 것에 대한 사랑을 위해. FOR 루프에 하나 이상의 이니셜 라이저를 넣지 마십시오. 나는 그것을 위해 Flak을 얻을 것이라는 것을 알고 있지만, 그것은 지저분하고 실제로 필요하지 않습니다. 당신이 고려할 수있는 것은 되풀이되는 기능입니다. 이 문제에 이상적입니다.

기본 함수는 항목이 0이 아님을 확인하지만 다른 기능은 인덱스를 다시 변경하더라도 확인하지 않습니다. 모르겠습니다. 나는 당신이 무엇을하려고하는지 정말로 이해하지 못합니다.

15 가지 요소의 배열 크기 15를 볼 수 있습니다. 선언 인덱스도 0에서 시작합니까? 잠시 확인하겠습니다. 크기로 선언했지만 0을 기준으로 액세스한지 확인하십시오.

한 곳이지만 나중에 진술에 대한 계산 조건을 사용한 이유는 무엇입니까? 더 잘 확인하십시오 && 보다 우선 순위가 높지 않습니다 <. 그룹 8은 그룹 13을 이겼다 여기. 증분 연산자는 성명서에서 여러 번 사용하지 않으면 좋습니다.

다른 언어 로이 문제를 수행 한 것처럼 들립니다. 당신도 그것에 대해 추적을하고 새로운 프로그램이 먼저 다른 곳을 찾을 수 있습니까?

다른 사람은 옳습니다. 질문은 혼란 스럽습니다. 먼저 피라미드가 그 시점에서 시작하여 맨 아래 줄에서 상단까지 쌓을 경우 가장 높은 점수를 얻는 다른 매트릭스에서 구매 하위 득점을 구매하는 문제를 해결하려고합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top