2016-05-06 41 views
1

在这个程序中,有一个使用2维数组构建的6×6地图。这个程序的目的是通过障碍物导航一个物体。每个坐标都包含一个值,每个值表示对象与目标之间的距离,如果它是对象的新坐标。对象的初始坐标是(0,5),其目标坐标是(5,0)。价值50意味着障碍。该对象应该选择包含最小值的下一个坐标。目的地的坐标值为0 这是图:我的代码有什么问题?多维数组? C编程

0 | 1 | 2 | 3 | 4 | 5 
0| 7 | 50| 3 | 2 | 1 | 0 
1| 6 | 5 | 4 | 3 | 2 | 1 
2| 7 | 6 | 5 | 50| 50| 50 
3| 8 | 7 | 6 | 7 | 8 | 9 
4| 50| 50| 50| 50| 50| 10 
5| 0 | 15| 14| 13| 12| 11 

该程序是假设输出从(0,5)的一系列坐标到(5,0)。

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

//These are the functions to move the object through the map. 
void moveForward(int new_c[1][2]); 
void moveBackward(int new_c[1][2]); 
void moveLeft(int new_c[1][2]); 
void moveRight(int new_c[1][2]); 

int main() 
{ 
    int map[6][6]={{7,50,3,2,1,0}, 
        {6,5,4,3,2,1}, 
        {7,6,5,50,50,50}, 
        {8,7,6,7,8,9}, 
        {50,50,50,50,50,10}, 
        {0,15,14,13,12,11}}; 

    int coordinate[1][2]={{0,5}}; 
    int x = 0; 
    int y = 5; 

    printf("(%d,%d),",x,y); 

    while(x!=5&&y!=0) 
    {   
     if(map[y-1][x] < map[y+1][x] && //Forward < Backward 
      map[y-1][x] < map[y][x-1] && //Forward < Left 
      map[y-1][x] < map[y][x+1] && //Forward < Right 
      y - 1 >= 0 && 
      y + 1 <= 5 && 
      x - 1 >= 0 && 
      x + 1 <= 5) 
      { 
       moveForward(coordinate); 
       y = y - 1; 
      } 
      else 
      {  
       if(map[y+1][x] < map[y-1][x] && //Backward < Forward 
        map[y+1][x] < map[y][x-1] && //Backward < Left 
        map[y+1][x] < map[y][x+1] && //Backward < Right 
        y - 1 >= 0 && 
        y + 1 <= 5 && 
        x - 1 >= 0 && 
        x + 1 <= 5) 
        { 
         moveBackward(coordinate); 
         y = y + 1; 
        } 
        else 
        {  
         if(map[y][x-1] < map[y][x+1] && //Left < Right 
          map[y][x-1] < map[y+1][x] && //Left < Backward 
          map[y][x-1] < map[y-1][x] && //Left < Forward 
          y - 1 >= 0 && 
          y + 1 <= 5 && 
          x - 1 >= 0 && 
          x + 1 <= 5) 
          { 
           moveLeft(coordinate); 
           x = x + 1; 
          } 
          else 
          {  
           if(map[y][x+1] < map[y][x-1] && //Right < Left 
           map[y][x+1] < map[y+1][x] && //Right < B 
           map[y][x+1] < map[y-1][x] && //Right < F 
           y - 1 >= 0 && 
           y + 1 <= 5 && 
           x - 1 >= 0 && 
           x + 1 <= 5) 
           { 
            moveRight(coordinate); 
            x = x - 1; 
           } 
          } 
        } 
      } 
    } 
return 0; 
} 

void moveForward(int new_c[1][2]) 
{ //This modifies the y coordinate. 
    new_c[0][1] = new_c[0][1] - 1; 
    printf("(%d,%d),", new_c[0][0], new_c[0][1]); 
} 

void moveBackward(int new_c[1][2]) 
{ //This modifies the y coordinate. 
    new_c[0][1] = new_c[0][1] + 1; 
    printf("(%d,%d),", new_c[0][0], new_c[0][1]); 
} 

void moveLeft(int new_c[1][2]) 
{ //This modifies the x coordinate. 
    new_c[0][0] = new_c[0][0] - 1; 
    printf("(%d,%d),", new_c[0][0], new_c[0][1]); 
} 

void moveRight(int new_c[1][2]) 
{ //This modifies the x coordinate. 
    new_c[0][0] = new_c[0][0] + 1; 
    printf("(%d,%d),", new_c[0][0], new_c[0][1]); 
} 



Output: 
(0,5), 

然后光标就像往常一样闪烁。 底部没有声明返回值或执行时间。

+0

'if(map [y] [x + 1] = 0 && y + 1 <=5&&x-1> = 0 && x + 1 <= 5)' 这对我来说看起来相当不对。你真的知道这行代码应该做什么吗?我肯定不会,我会删除它并重新开始。 –

+1

你是否尝试用调试器单步执行代码? – pm100

+0

您的循环在某处出现了无限循环 - 您可能未满足if语句中的任何条件 - 尝试使用调试器单步执行程序并查看出了什么问题。 – Soren

回答

1

您的代码访问地图之外的部分。例如,如果x为0,则访问map[y][x-1]。这是未定义的行为,可能会导致您遇到的无限循环。

您有&& x - 1 >= 0在您的情况。所以如果x == 0,所有的条件将永远是错误的,因此coordinate永远不会改变。由于x0开头,所以什么也没有发生。

另一编辑:虽然我在它,while(x!=5&&y!=0)也是错误的。只要您到达正确的列行,循环就会停止。你想要while(x != 5 || y != 0)

+0

我在if语句中强加的条件“&& x - 1> = 0”是什么?这是错的吗?在语法或任何方面? – Hiew

+0

嗯,我没有看到它,因为你的代码格式很好。但即使如此,你的代码访问它不应该存储的区域,所以它仍然是未定义的行为。 – flyx

+0

@Hiew:没错,但是你的代码缺少格式化以提高可读性。对于复杂的表达式,添加括号通常也是很好的,即使它们不是必需的。 – Olaf