在这个程序中,有一个使用二维数组构建的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),
然后光标像往常一样闪烁。 底部没有声明返回值或执行时间。
答案 0 :(得分:1)
您的代码访问地图外部的部分。例如,如果x
为0,则访问map[y][x-1]
。这是未定义的行为,可能会导致您遇到的无限循环。
您的条件是&& x - 1 >= 0
。因此,如果x == 0
,所有条件将始终为false,因此永远不会更改coordinate
。由于x
以0
开头,所以没有任何事情发生。
另一个编辑:虽然我在这里,while(x!=5&&y!=0)
也是错误的。一旦到达正确的列或行,循环就会停止。你想要while(x != 5 || y != 0)
。