GridWalk CodeEval实现问题

时间:2014-04-15 02:44:25

标签: c++ c performance algorithm optimization

这是我在CodeEval上遇到的问题。这是我一直在努力工作4个小时的问题。 我从2年前就看到了另一个CodeEval GridWalk问题的帖子,但它根本没有帮助我。如果有任何人遇到过这个问题,请阅读我的代码,因为我不知道我做错了什么。

有一只猴子可以在平面网格上走动。猴子可以一次向左,向右,向上或向下移动一个空间。也就是说,从(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(-5)+ 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's true
return 1;
else
return 0;
}

这个节目的输出是575199.这显然不是写答案。

2 个答案:

答案 0 :(得分:0)

首先,你不需要做这样的事情 z = x * pow(10, (int)log10(y)+1) + y;因为log10函数的强制转换(int)总是向下舍入,所以会有两种情况,当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来处理这个部分

答案 1 :(得分: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;
}