我的代码出了什么问题?多维数组? C编程

时间:2016-05-06 16:57:07

标签: c multidimensional-array

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

   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),

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

1 个答案:

答案 0 :(得分:1)

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

您的条件是&& x - 1 >= 0。因此,如果x == 0,所有条件将始终为false,因此永远不会更改coordinate。由于x0开头,所以没有任何事情发生。

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