Проблема реализации GridWalk CodeEval

0

Это проблема, которую я делаю на CodeEval. Это проблема, над которой я работал в течение 4 часов. Я видел еще одно сообщение об ошибке CodeEval GridWalk здесь от 2 лет назад, но мне это совсем не помогло. Если у кого-то был опыт работы с этой проблемой, прочитайте мой код, потому что я не знаю, что я делаю неправильно.

Есть обезьяна, которая может ходить по плоской сетке. Обезьяна может перемещать одно пространство за раз влево, вправо, вверх или вниз. То есть, из (x, y) обезьяна может перейти к (x + 1, y), (x-1, y), (x, y + 1) и (x, y-1). Точки, где сумма цифр абсолютного значения координаты x плюс сумма цифр абсолютного значения координаты y меньше или равна 19, доступны для обезьяны. Например, точка (59, 79) недоступна, потому что 5 + 9 + 7 + 9 = 30, что больше 19. Другой пример: точка (-5, -7) доступна, поскольку abs ([CN00 ]) + abs (-7) = 5 + 7 = 12, что меньше 19. Сколько очков может получить обезьяна, если она начинается с (0, 0), включая (0, 0)? Образец ввода:

Для этой программы нет ввода. Выходной образец:

Распечатайте количество точек, к которым может обратиться обезьяна. Его следует печатать как целое число - например, если количество точек равно 10, напечатайте "10", а не "10.0" или "10.00" и т.д.

Отправьте свое решение в файл (некоторое имя файла). (Py2 | c | cpp | java | rb | pl | php | tcl | clj | js | scala | cs | m | py3 | hs | go | bash | lua) или используйте онлайн-редактор.

#include <stdio.h>
#include <math.h>

int z = 0, counter = 0, x = 0, y = 0, d = -1;

int verified(int x, int y);

int fill();

int main(void){
printf("%d",fill());
return 0;
}

//(x+1, y), (x-1, y), (x, y+1), and (x, y-1)

int fill(){
int i = 0;
while(d<1000000){  //I don't know how to make it so the program doesn't need a 
d++; i++;          //dimension for scanning. I have to end the loop somehow.

if(verified(x,y)){ //scan each point
                   //if x and y are accessible or "verified", increase point counter
counter++;
}else{;}  // do nothing

if((y%2)!= 0){  //increment each point
y += i;
continue;
}else if ((x%2)!=0){
x += i; 
continue;
}else if ((y%2) == 0){
y -= i;
continue;
}else if((x%2) == 0){
x -= i;
continue;
}



}
return counter; //return how many accessible points there are
}

int verified(int x , int y){
int r, digit = 0;
x = abs(x); y = abs(y);                //make x and y absolute
z = x * pow(10, (int)log10(y)+1) + y;
   //^append both values together(eg. x and y become xy)

while (z > 0) {   
 r = z % 10;        
 digit += abs(r);   // add all the digits of the sum together
 z /= 10;
}

if(digit <=19)   //if the sum is less than  or equal to 19, it true
return 1;
else
return 0;
}

Мой выход для этой программы был 575199. Это, видимо, не ответ на запись.

Теги:
optimization
performance
algorithm

2 ответа

0

Я не уверен, что следующее дает правильный ответ (возможно, вы можете проверить его), но он показывает идею.

#include <stdio.h>
#include <stdlib.h>

#define SIZE 600
#define LIMIT 19

char grid[SIZE][SIZE];

int sumdigs(int x) {
  int sum = 0;
  x = x < 0 ? -x : x;
  while (x != 0) { sum += x % 10; x /= 10; }
  return sum;
}

void walk(int x, int y) {
  int xx = x + SIZE / 2;
  int yy = y + SIZE / 2;
  if (xx < 0 || xx >= SIZE || yy < 0 || yy >= SIZE) {
    fprintf(stderr, "You need to make the grid larger.\n");
    exit(EXIT_FAILURE);
  }
  if (sumdigs(x) + sumdigs(y) > LIMIT)
    return;
  if (grid[xx][yy] == 0) {
    grid[xx][yy] = 1;
    walk(x,   y+1);
    walk(x,   y-1);
    walk(x+1, y);
    walk(x-1, y);
  }
}

int count_accessible_points() {
  int cnt = 0;
  for(int y=0; y<SIZE; ++y)
    for(int x=0; x<SIZE; ++x)
      if (grid[x][y]) ++cnt;
  return cnt;
}

int main() {
  walk(0, 0);
  printf("%d\n", count_accessible_points());
  return 0;
}
  • 0
    Не могли бы вы добавить комментарии, объясняющие каждый процесс? почему вы сделали сетку типа "char"? я пытаюсь понять рекурсивную функцию, которую вы реализовали. в какой момент это заканчивается?
0

Во-первых, вам не нужно делать что-то вроде этого z = x * pow(10, (int)log10(y)+1) + y; потому что функция cast (int) для функции log10 всегда будет округлять вниз, поэтому будут два случая, когда y является степенью 10, а y - нет, что явно не подходит для этой части. Вы можете исправить это, вычислив сумму для цифры один за другим, для x сначала, а затем для y, вам не нужно их комбинировать.

Во-вторых, если я не ошибаюсь, вы можете только перейти от доступной точки к другой доступной точке, поэтому еще раз эта часть неверна:

if((y%2)!= 0){  //increment each point
    y += i;
    continue;
}else if ((x%2)!=0){
    x += i; 
    continue;
}else if ((y%2) == 0){
    y -= i;
    continue;
}else if((x%2) == 0){
    x -= i;
    continue;
}

Просто слепо увеличить x и y не гарантирует, что точка (x, y) достижима, должна обрабатывать эту часть с помощью BFS или DFS

  • 0
    Да, обезьяна может перемещаться только из одной доступной точки в другую, но все, что делает этот сегмент кода, - это перемещает точку, чтобы подготовить ее к оценке «проверенной» функцией. (например, (x = 0, y = 0), (x = 0, y = 1), (x = 1, y = 1), (x = 2, y = 1), (x = 2, y = -1) .. Шаблон обхода точек, реализованный в сегменте кода, явно выглядит следующим образом: (x + 1, y + 1) -> (x-2, y-2) -> (x-3, y-3 ) -> (x + 4, y + 4) -> ..
  • 0
    @Rudy Как убедиться, что точка (x + i, y + i), (x + i, y - i) ... достижима из одной доступной точки? вы просто проверяете, что каждая точка может быть создана с помощью цикла, это не правильно !, вы должны только проверять эти достижимые точки.
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню