在这个程序中,有一个使用二维数组构建的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),
然后光标像往常一样闪烁。底部没有说明返回值或执行时间的语句。
您的代码访问映射之外的部分。例如,如果x
为0,则访问map[y][x-1]
。这是未定义的行为,可能会导致您正在经历的无限循环。
在您的条件下,您有&& x - 1 >= 0
。因此,如果x == 0
,所有条件都将始终为假,因此coordinate
永远不会改变。由于x
从0
开始,所以不会发生任何事情。
另一个编辑:当我在做的时候,while(x!=5&&y!=0)
也错了。一旦到达正确的列或行,循环就会停止。您需要while(x != 5 || y != 0)
。