学校の課題で迷路探索のプログラムを動かすアルゴリズムの問題に取り組んでいるのですが、課題のファイルを読み込むとコアダンプをおこしてしまい動作しませんでした。
読み込む配列を減らすと動作するのでおそらく容量かなにかの問題と思うのですが、家のパソコンではすべて課題のファイルでは動かず手つかずとなっています。
大変お手数ですが、以下の書いたプログラムで何か変更する点等がございましたらご指摘していただけるとありがたいです。
言語はC言語を使用しています。読んでいただきありがとうございます。よろしくお願いいたします。
C
1#include <stdio.h> 2#include <stdlib.h> 3 4#define yoko 101 /*横*/ 5#define tate 101 /*縦*/ 6#define N 1000 7 8int counter=0; 9int qcounter=0; 10int qlist=0; 11int olist=0; 12 13struct queue{ 14 int data[N]; 15 int head; 16 int tail; 17}; 18 19void initialize(struct queue *q){ 20 int i; 21 22 q->head=0; 23 q->tail=0; 24 for(i=0; i < N; ++i){ 25 q->data[i]=' '; 26 } 27} 28 29 30void enqueue(struct queue *q, int i){ 31 32 if (q->tail >= N) { 33 printf("This queue is full! \n"); 34 }else{ 35 q->data[q->tail]=i; 36 q->tail++; 37 } 38 39 qcounter++; 40 41 if(qcounter > qlist){ 42 qlist = qcounter; 43 } 44} 45 46int dequeue(struct queue *q){ 47 int j; 48 49 if(q->head == q->tail){ 50 return -1; 51 }else{ 52 j=q->data[q->head]; 53 q->head++; 54 qcounter--; 55 return j; 56 } 57} 58 59 60 61void next(char x[101][101] , int s, int t, struct queue *Q){ 62 int i, j; 63 counter++; 64 65 if(x[s+1][t] == 'G' || x[s][t+1] == 'G' || x[s-1][t] == 'G' || x[s][t-1] == 'G'){ 66 printf("GOAL\n"); 67 printf("%d回読み込まれました。\n", counter); 68 printf("キューの必要メモリ量:%d\n", qlist); 69 printf("オープンリストの必要メモリ量:%d\n", olist); 70 71 printf("\n"); 72 for(i=0;i<tate;i++){ 73 for(j=0;j<yoko;j++){ 74 printf("%c", x[i][j]); 75 } 76 printf("\n"); 77 } 78 79 exit(0); 80 } 81 82 if(x[s+1][t] == '0'){ /*下へとループ*/ 83 x[s+1][t] = '2'; 84 olist++; 85 86 printf("\n"); 87 for(i=0;i<tate;i++){ 88 for(j=0;j<yoko;j++){ 89 printf("%c", x[i][j]); 90 } 91 printf("\n"); 92 } 93 94 s = s+1; 95 printf("current position:%d,%d", s, t); //現在の座標を表示 96 enqueue(Q, s); 97 enqueue(Q, t); 98 s = s-1; 99 } 100 101 if(x[s][t+1] == '0'){ /*右へとループ*/ 102 x[s][t+1] = '2'; 103 olist++; 104 105 printf("\n"); 106 for(i=0;i<tate;i++){ 107 for(j=0;j<yoko;j++){ 108 printf("%c", x[i][j]); 109 } 110 printf("\n"); 111 } 112 113 t = t+1; 114 printf("current position:%d,%d", s, t); //現在の座標を表示 115 enqueue(Q, s); 116 enqueue(Q, t); 117 t = t-1; 118 } 119 120 if(x[s-1][t] == '0'){ /*上へとループ*/ 121 x[s-1][t] = '2'; 122 olist++; 123 124 printf("\n"); 125 for(i=0;i<tate;i++){ 126 for(j=0;j<yoko;j++){ 127 printf("%c", x[i][j]); 128 } 129 printf("\n"); 130 } 131 132 s = s-1; 133 printf("current position:%d,%d", s, t); //現在の座標を表示 134 enqueue(Q, s); 135 enqueue(Q, t); 136 s = s+1; 137 } 138 139 140 if(x[s][t-1] == '0'){ /*上へとループ*/ 141 x[s][t-1] = '2'; 142 olist++; 143 144 printf("\n"); 145 for(i=0;i<tate;i++){ 146 for(j=0;j<yoko;j++){ 147 printf("%c", x[i][j]); 148 } 149 printf("\n"); 150 } 151 152 t = t-1; 153 printf("current position:%d,%d", s, t); //現在の座標を表示 154 enqueue(Q, s); 155 enqueue(Q, t); 156 t = t+1; 157 } 158 159 s = dequeue(Q); 160 t = dequeue(Q); 161 162 next(x, s, t, Q); 163} 164 165 166void main(){ 167 int s=0, t=0; 168 int flag=0; 169 char data[yoko][tate]; 170 char mozi; 171 FILE *fp; /*ファイルポインタ*/ 172 173 fp = fopen("zikken.txt","r"); 174 for(s=0;s<tate;s++){ 175 for(t=0;t<yoko;t++){ 176 data[s][t] = fgetc(fp); 177 } 178 mozi = fgetc(fp); 179 mozi = fgetc(fp); 180 } 181 182 for(s=0;s<tate;s++){ 183 for(t=0;t<yoko;t++){ 184 printf("%c", data[s][t]); 185 } 186 printf("\n"); 187 } 188 189 fclose(fp); 190 191 s=1; t=1; /*スタート地点*/ 192 data[s][t] = 'S'; 193 data[yoko-2][tate-2] = 'G'; 194 195 struct queue Q; 196 197 initialize(&Q); 198 199 200 next(data, s, t, &Q); 201 202 return; 203}
text
111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 210000000000000000010000010000010000010000000100000000000000010000000001000000000100000000000100000001 3・ 4・ 5・
文字数制限のため以下は省略いたします。申し訳ありません。読み込みたいデータは101101の配列、0が通れる道、1が壁、2がすでに通った道というように考えています。ちなみに1111の同様の配列では動くことができました。
使用しているパソコンはcpu core i7 2600、メモリは10GBです。
よろしくお願いいたします。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/05/11 21:16
2017/05/15 01:26