Как я опубликовал возможное решение проблемы 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, но почему? Редактировать
Разве компилятор не кричит, когда вы переходите к 'prune_boxes() как 1-й параметр, чем-то другим, как ожидалось? – alk
Да, это так ... Я нахожу, что это самый простой способ передать массив переменной длины функции в c99..может ли это быть причиной этого? .. Кроме того, как вы передадите vla функции? –
Используйте что-то вроде 'void foo (size_t x, size_t y, int p [x] [y]);'. Вопросы для заказа. – alk