2016-01-19 5 views
-1

Как я опубликовал возможное решение проблемы CodeForce, которая вызывала ошибку Time Limit Exceed enter link description here, некоторые решения пришли. Тем не менее, я работал с другим решением ..Расположение массива становится автоматически автоматически

#include <stdio.h> 
#include <string.h> 

int greatestX = 0, greatestY = 0; 
int counter = 0; 

void prune_boxes(int boxes[][greatestY], int x, int y){ 
    printf("boxes[2][0] = %d\n", boxes[2][0]); 
    if (y < 0) 
    return; 
    else{ 
    //printf("x = %d y = %d\n", x, y); 
    if (boxes[x][y] == 0){ 
     printf("x = %d y = %d\n", x, y); 
     counter++; 
     boxes[x][y] = 1; 
    } 
    prune_boxes(boxes, x, y - 1); 
    prune_boxes(boxes, x + 1, y - 1); 
    } 
} 


int main() { 
    int wetBoxes, i, j; 
    scanf("%d", &wetBoxes); 
    int coordinates[wetBoxes][2]; 
    for(i = 0; i < wetBoxes; i++){ 
    scanf("%d%d", &coordinates[i][0], &coordinates[i][1]); 
    if (coordinates[i][0] > greatestX) 
     greatestX = coordinates[i][0]; 
    if (coordinates[i][1] > greatestY) 
     greatestY = coordinates[i][1]; 
    } 
    int boxes[greatestY + 1][greatestY + greatestX + 1]; 
    memset(boxes, 0, sizeof(boxes)); 
    /* 
    for(i = 0; i < greatestY + 1; i++){ 
    for (j = 0; j < greatestY + greatestX + 1; j++){ 
     printf("%d ", boxes[i][j]); 
    } 
    printf("\n"); 
    } 
    */ 

    for(i = 0; i < wetBoxes; i++){ 
    //printf("value = %d\n", boxes[coordinates[i][0]][coordinates[i][1]]); 
    prune_boxes(boxes, coordinates[i][0], coordinates[i][1]); 
    } 
    printf("counter = %d\n", counter); 

return 0; 
} 

Не вызывая предельного времени Exceed сейчас, но это дает мне один меньше количество какого-либо конкретного значения.

Отладка в дальнейшем Я обнаружил, что для ввода (1, 3) код не считается координатой (2, 0).

Даже при дальнейшей отладке я обнаружил, что boxes[2][0] становится 1 до того, как я на самом деле сделаю эту координату 1 вручную.

выход

образец выглядит следующим образом

1 
1 3 
boxes[2][0] = 0 
x = 1 y = 3 
boxes[2][0] = 1 
x = 1 y = 2 
boxes[2][0] = 1 
x = 1 y = 1 
boxes[2][0] = 1 
x = 1 y = 0 
boxes[2][0] = 1 
boxes[2][0] = 1 
boxes[2][0] = 1 
boxes[2][0] = 1 
boxes[2][0] = 1 
boxes[2][0] = 1 
x = 2 y = 1 
boxes[2][0] = 1 
boxes[2][0] = 1 
boxes[2][0] = 1 
boxes[2][0] = 1 
x = 3 y = 0 
boxes[2][0] = 1 
boxes[2][0] = 1 
boxes[2][0] = 1 
x = 2 y = 2 
boxes[2][0] = 1 
boxes[2][0] = 1 
boxes[2][0] = 1 
boxes[2][0] = 1 
boxes[2][0] = 1 
boxes[2][0] = 1 
boxes[2][0] = 1 
boxes[2][0] = 1 
x = 3 y = 1 
boxes[2][0] = 1 
boxes[2][0] = 1 
boxes[2][0] = 1 
boxes[2][0] = 1 
x = 4 y = 0 
boxes[2][0] = 1 
boxes[2][0] = 1 
counter = 9 

Как вы можете видеть, что boxes[2][0] со второго уровня рекурсии становится 1, но почему? Редактировать

enter image description here

+0

Разве компилятор не кричит, когда вы переходите к 'prune_boxes() как 1-й параметр, чем-то другим, как ожидалось? – alk

+0

Да, это так ... Я нахожу, что это самый простой способ передать массив переменной длины функции в c99..может ли это быть причиной этого? .. Кроме того, как вы передадите vla функции? –

+0

Используйте что-то вроде 'void foo (size_t x, size_t y, int p [x] [y]);'. Вопросы для заказа. – alk

ответ

1

Я получаю много предупреждений компилятора для этой части

int greatestX = 0, greatestY = 0; 
int counter = 0; 

void prune_boxes(int boxes[][greatestY], int x, int y){ 

говоря, что greatestY не является постоянной величиной. Итак, как функция знать размер массива?

Если он принимает greatestY как размер в этот момент, массив будет int boxes[][0], и все обращения будут за пределами диапазона. Это, безусловно, может создать неожиданные результаты.

И массив вы передаете не от этих размеров в любом случае, но

int boxes[greatestY + 1][greatestY + greatestX + 1]; 
+0

Как вы компилируете ..?вы используете 'gcc -std = c99' –

+2

gcc принимает размеры переменной массива (VLA). Я использовал MSVC, которого нет. Но в любом случае вы передаете массив другого размера, чем ожидает функция. –

+0

О, но да, вы правы. Я передал массив правильного размера ('наибольшийY + наибольший X + 1'), и теперь он подсчитывает' 2, 0', но некоторые другие значения отбираются ... Это потому, что я неправильно передал массив в функции? –

0

спасибо людей для ответа на вопрос, похоже, эта проблема прохождения 2D массива в функцию. gcc не выдавал никаких сообщений или предупреждений, но clang произнесения ошибки. Поэтому я решил решить его на C++. Вот решение:

#include <iostream> 
#include <vector> 
#include <algorithm> 

static int counter; 
std::vector<std::vector<int>> boxes; 
void prune_boxes(int x, int y){ 
if (y < 0) 
    return; 
else{ 
    if (boxes[x][y] == 0){ 
    boxes[x][y] = 1; 
    counter++; 
    } 
    prune_boxes(x, y - 1); 
    prune_boxes(x + 1, y - 1); 
} 
} 



int main(){ 
    int wetBoxes; 
    std::cin >> wetBoxes; 
    std::vector<int> coordinatesX; 
    std::vector<int> coordinatesY; 
    int input; 
    for (int i = 0; i < wetBoxes; i++){ 
    std::cin >> input; 
    coordinatesX.push_back(input); 
    std::cin >> input; 
    coordinatesY.push_back(input); 
    } 

    int greatestX = *max_element(coordinatesX.begin(), coordinatesX.end()); 
    int greatestY = *max_element(coordinatesY.begin(), coordinatesY.end()); 

    int Y = greatestY + 1; 
    int X = greatestX + greatestY + 1; 
    boxes.resize(X); 
    for (int i = 0; i < X; i++){ 
    for (int j = 0; j < Y; j++){ 
     boxes[i].push_back(0); 
    } 
    } 

    for(int i = 0; i < wetBoxes; i++){ 
    prune_boxes(coordinatesX[i], coordinatesY[i]); 
    std::cout << counter << std::endl; 
    counter = 0; 
    } 
    return 0; 
} 
Смежные вопросы