C++ GridWalk代码评估实现问题

C++ GridWalk代码评估实现问题,c++,c,performance,algorithm,optimization,C++,C,Performance,Algorithm,Optimization,这是我在CodeEval上做的一个问题。这个问题我已经研究了4个小时了。 两年前,我在这里看到了另一篇关于CodeEval GridWalk问题的帖子,但这对我毫无帮助。如果有人遇到过这个问题,请阅读我的代码,因为我不知道我做错了什么 有一只猴子可以在平面网格上走动。猴子一次可以向左、向右、向上或向下移动一个空间。也就是说,猴子可以从(x,y)到(x+1,y),(x-1,y),(x,y+1)和(x,y-1)。猴子可以访问x坐标绝对值的数字总和加上y坐标绝对值的数字总和小于或等于19的点。例如,点

这是我在CodeEval上做的一个问题。这个问题我已经研究了4个小时了。 两年前,我在这里看到了另一篇关于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;
}
#包括
#包括
int z=0,计数器=0,x=0,y=0,d=-1;
已验证的整数(整数x,整数y);
int fill();
内部主(空){
printf(“%d”,fill());
返回0;
}
//(x+1,y)、(x-1,y)、(x,y+1)和(x,y-1)
int fill(){
int i=0;
而(d0){
r=z%10;
digit+=abs(r);//将总和的所有数字相加
z/=10;
}

如果(digit首先,您不需要这样做
z=x*pow(10,(int)log10(y)+1)+y;
因为演员阵容(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来处理这一部分,我不确定下面给出的答案是否正确(也许你可以测试一下),但它说明了这一点

#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;
}
#包括
#包括
#定义大小600
#定义限制19
字符网格[大小][大小];
int sumdigs(int x){
整数和=0;
x=x<0?-x:x;
而(x!=0){sum+=x%10;x/=10;}
回报金额;
}
虚步(整数x,整数y){
int xx=x+大小/2;
int yy=y+尺寸/2;
如果(xx<0 | | xx>=尺寸| | yy<0 | | yy>=尺寸){
fprintf(stderr,“您需要使网格更大。\n”);
退出(退出失败);
}
如果(sumdigs(x)+sumdigs(y)>极限)
返回;
如果(网格[xx][yy]==0){
网格[xx][yy]=1;
步行(x,y+1);
步行(x,y-1);
步行(x+1,y);
步行(x-1,y);
}
}
整数计数\u可访问\u点(){
int-cnt=0;

对于(int y=0;yYes),猴子只能从一个可访问点移动到另一个可访问点,但这段代码所做的只是移动该点,以准备由“验证”函数对其进行评估。(例如,(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)->@Rudy如何确保点(x+i,y+i),(x+i,y-i)…可以从一个可访问点访问?您只需检查循环可以创建的每个点,这是不对的!您应该只检查这些可访问点。@例如,Rudy,点(280,180)是有效的,对吗?但它不能访问,因为点(279180)、点(280,179)、点(281180)和点(280,181)无效,因此无法达到此点(280,180):D@Rudy此外,在循环中,您没有检查abs(x)和abs(y)不相等的情况,在您的注释中,您可以清楚地看到您无法检查点(2,1)或点(5,1)在你开始为解决方案编写代码之前,你知道怎么做吗?也就是说,我完全不知道BFS或DFS算法是什么。你能添加注释解释每个过程吗?为什么你制作的网格是“char”类型的?我试图理解您实现的递归函数。它在什么时候结束?