gpt4 book ai didi

c - 段错误(核心转储)。具有变化条目的二维数组

转载 作者:行者123 更新时间:2023-11-30 19:18:28 25 4
gpt4 key购买 nike

我正在开发一个程序,它将找到从机器人到导出的最短路径。机器人将在二维阵列上垂直和水平移动。将会有 10 个障碍物阻碍机器人的移动。导出始终位于 0x7,机器人和方 block 的位置是随机创建的。

我寻找最短路径的方法是找到机器人的位置,然后在右、左、上、下每个可能的位置上放入 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;
}

最佳答案

matrixini() 中的

a = rand() % 9 可能会得出 8,这是越界的。与 b = rand() % 9 相同。

您可能希望将它们更改为 a = rand() % 8b = 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;
}
}
}
}
}

说明:

对于满足 A[i][j] = num 的每个位置 (i, j),我们使用 didj(i, j) 计算可能的相邻单元格。本质上,ninj 涵盖了所有这些情况:(i + 1, j)、(i - 1, j)、(i, j + 1 ), (i, j - 1).

然后,if 语句检查 ninj 是否都在界内。如果当前为 -1,我们将 A[ni][nj] 更新为 num + 1

但是,您应该注意,您应该利用一些有效的最短路径算法,其中一些是:

另外,我希望您在编写整个程序后不要开始测试代码——这几乎总是会导致痛苦的错误。

关于c - 段错误(核心转储)。具有变化条目的二维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26705568/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com