我正在开发一个程序,它将找到从机器人到出口的最短路径。机器人将在2d阵列上垂直和水平移动。将有10个阻碍机器人运动的块。出口始终位于0x7,机器人和块的位置是随机创建的。
我正在寻找最短路径的方法是找到机器人的位置,然后在左右,上下各个可能的位置放置1。然后找到1,并向右,向左,向上和向下放2。然后通过找到2再次,向右和向左,向上和向下放3。我会这样做,直到填满矩阵。
然后,最短路径将从机器人到退出,然后按数字递增顺序。所以,我认为我完成了大部分程序。
我的问题与用1,2,3,4.etc填充矩阵的函数有关。我得到了分段错误,我假设,在做了一些研究后,错误是因为我使用的是我无法访问的内存。如果是这种情况,我认为问题是我填充矩阵的功能。你能帮我发现我的功能有什么问题吗?我包括我迄今为止为我的程序所写的内容。
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int main() {
int A[8][8],num=0;
char B[8][8];
char C[64];
char D[64];
intmatrix(A);
charmatrix(B);
matrixini(B,A);
while(num<64) {
matrix_find_fill(A,num);
num++;
}
printmatrix(B,A);
return 0;
}
int printmatrix(char B[8][8], int A[8][8]) {
int i, j;
for(i=0;i<8;i++) {
for(j=0;j<8;j++) {
printf("%c ",B[i][j]);
}
printf("\n");
}
for(i=0;i<8;i++) {
for(j=0;j<8;j++) {
printf("%i ",A[i][j]);
}
printf("\n");
}
return 0;
}
int charmatrix(char B[8][8]) {
int i,j;
for(i=0;i<8;i++) {
for(j=0;j<8;j++) {
B[i][j]=' ';
}
}
return 0;
}
int intmatrix(int A[8][8]) {
int i,j;
for(i=0;i<8;i++) {
for(j=0;j<8;j++) {
A[i][j]=-1;
}
}
return 0;
}
int matrixini(char B[8][8], int A[8][8]) {
int r,c,a,b,n=0;
srand((unsigned int)time(NULL) );
a=rand()%9;
b=rand()%9;
B[a][b]='R';
A[a][b]=0;
B[0][7]='E';
A[0][7]=99;
do{
r=rand()%8;
c=rand()%8;
if (B[r][c]==' ') {
B[r][c]='#';
A[r][c]=-2;
n++;
}
} while(n<10);
if ((B[0][6]=='#') && (B[1][7]=='#')) {
printf("The Robot wont be able to exit.Game over!\n");
exit(0);
}
return 0;
}
int matrix_find_fill(int A[8][8],int num) {
int i,j;
for(i=0;i<8;i++) {
for(j=0;j<8;j++) {
if(A[i][j]==num) {
if(i==0) {
if((j>=0) && (j<=7)) {
if(j==0) {
if(A[i+1][j]==-1) {
A[i+1][j]=num+1;
}
if(A[i][j+1]==-1) {
A[i][j+1]=num+1;
}
}
if((j>0) && (j<7)) {
if(A[i][j-1]==-1) {
A[i][j-1]=num+1;
}
if(A[i][j+1]==-1) {
A[i][j+1]=num+1;
}
if(A[i-1][j]==-1) {
A[i-1][j]=num+1;
}
}
if(j==7) {
if(A[i+1][j]==-1) {
A[i+1][j]=num+1;
}
if(A[i][j-1]==-1) {
A[i][j-1]=num+1;
}
}
}
if((j<7) && (A[i][j+1]==-1)) {
A[i][j+1]=num+1;
}
}
if((i>0) && (i<7)) {
if((j>=0) && (j<=7)) {
if(j==0) {
if(A[i+1][j]==-1) {
A[i+1][j]=num+1;
}
if(A[i][j+1]==-1) {
A[i][j+1]=num+1;
}
if(A[i-1][j]==-1) {
A[i-1][j]=num+1;
}
}
if((j>0) && (j<7)) {
if(A[i][j-1]==-1) {
A[i][j-1]=num+1;
}
if(A[i][j+1]==-1) {
A[i][j+1]=num+1;
}
if(A[i-1][j]==-1) {
A[i-1][j]=num+1;
}
if(A[i+1][j]==-1) {
A[i+1][j]=num+1;
}
}
if(j==7) {
if(A[i+1][j]==-1) {
A[i+1][j]=num+1;
}
if(A[i][j-1]==-1) {
A[i][j-1]=num+1;
}
if(A[i-1][j]==-1) {
A[i-1][j]=num+1;
}
}
}
if((j<7) && (A[i][j+1]==-1)) {
A[i][j+1]=num+1;
}
}
if(i==7) {
if((j>=0) && (j<=7)) {
if(j==0) {
if(A[i-1][j]==-1) {
A[i-1][j]=num+1;
}
if(A[i][j+1]==-1) {
A[i][j+1]=num+1;
}
}
if((j>0) && (j<7)) {
if(A[i][j-1]==-1) {
A[i][j-1]=num+1;
}
if(A[i][j+1]==-1) {
A[i][j+1]=num+1;
}
if(A[i-1][j]==-1) {
A[i-1][j]=num+1;
}
}
if(j==7) {
if(A[i-1][j]==-1) {
A[i-1][j]=num+1;
}
if(A[i][j-1]==-1) {
A[i][j-1]=num+1;
}
}
}
if((j<7) && (A[i][j+1]==-1)) {
A[i][j+1]=num+1;
}
}
}
}
}
return 0;
}
答案 0 :(得分:1)
a = rand() % 9
中的 matrixini()
可能会出现在8,这超出了界限。与b = rand() % 9
相同。
您可能希望将这些内容更改为a = rand() % 8
和b = rand() % 8
。
考虑到代码的长度和棘手,您应该将matrix_find_fill()
函数重构为更简单的格式。
以下是另一种方法:
int di[] = {0, 0, 1, -1};
int dj[] = {-1, 1, 0, 0};
int matrix_find_fill(int A[8][8], int num) {
int i, j, k, ni, nj;
for(i = 0; i < 8; i++) for(j = 0; j < 8; j++) {
if(A[i][j] == num) {
for(k = 0; k < 4; k++) {
ni = i + di[k];
nj = j + dj[k];
if(ni >= 0 && nj >= 0 && ni < 8 && nj < 8 && A[ni][nj] == -1) {
A[ni][nj] = num + 1;
}
}
}
}
}
说明:
对于满足(i, j)
的每个职位A[i][j] = num
,我们使用di
和dj
来计算(i, j)
中可能的相邻单元格。从本质上讲,ni
和nj
涵盖了所有这些案例:(i + 1, j), (i - 1, j), (i, j + 1), (i, j - 1)
。
然后,if语句检查ni
和nj
是否都在入境中。如果A[ni][nj]
当前为num + 1
,我们会将-1
更新为{{1}}。
但是,您应该注意,您应该利用有效的最短路径算法,其中一些是:
另外,我希望你在编写整个程序后没有开始测试代码 - 这几乎总是会导致痛苦的错误。