我正在研究一個程序,該程序可以找到從機器人到出口的最短路徑。機器人將在二維陣列上垂直和水平移動。將會有10塊阻礙機器人的移動。出口總是位於0x7,機器人和塊的位置是隨機創建的。分段錯誤(核心轉儲)。具有更改條目的2D陣列
我正在尋找最短路徑的方法是找到機器人的位置,然後將每個可能的位置放在右,左,上和下。然後找到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;
}
填充矩陣值時,作爲找到出口的最短路徑的一部分,必須從當前方向對每個方向進行檢查,以避免寫入矩陣之外。 I.E.函數matrix_find_fill()需要重新設計。 – user3629249 2014-11-03 01:33:03