回答編集履歴

5

追記

2017/05/08 16:44

投稿

A.Ichi
A.Ichi

スコア4070

test CHANGED
@@ -30,11 +30,11 @@
30
30
 
31
31
  struct queue{
32
32
 
33
- int data[N];
33
+ int data[N];
34
-
34
+
35
- int head;
35
+ int head;
36
-
36
+
37
- int tail;
37
+ int tail;
38
38
 
39
39
  };
40
40
 
@@ -42,8 +42,6 @@
42
42
 
43
43
  void initialize(struct queue *q){
44
44
 
45
- int i;
46
-
47
45
  q->head=0;
48
46
 
49
47
  q->tail=0;
@@ -58,13 +56,13 @@
58
56
 
59
57
  if (q->tail >= N) {
60
58
 
61
- printf("This queue is full! \n");
59
+ printf("This queue is full! \n");
62
60
 
63
61
  }else{
64
62
 
65
- q->data[q->tail]=i;
63
+ q->data[q->tail]=i;
66
-
64
+
67
- q->tail++;
65
+ q->tail++;
68
66
 
69
67
  }
70
68
 
@@ -122,25 +120,25 @@
122
120
 
123
121
  }else if (q->data[q->tail+1] == q->data[q->tail-1]){
124
122
 
125
- if ( q->data[q->tail] > q->data[q->tail-2] ){
123
+ if ( q->data[q->tail] > q->data[q->tail-2] ){
126
-
124
+
127
- j=2;
125
+ j=2;
128
-
129
- }else{
130
-
131
- j=0;
132
-
133
- }
134
-
135
- }else if(q->data[q->tail+1] > q->data[q->tail-1]){
136
-
137
- j=3;
138
126
 
139
127
  }else{
140
128
 
129
+ j=0;
130
+
131
+ }
132
+
133
+ }else if(q->data[q->tail+1] > q->data[q->tail-1]){
134
+
135
+ j=3;
136
+
137
+ }else{
138
+
141
- j=1;
139
+ j=1;
142
-
140
+
143
- }
141
+ }
144
142
 
145
143
  return j;
146
144
 
@@ -166,24 +164,8 @@
166
164
 
167
165
  printf("オープンリストの必要メモリ量:%d\n", olist);
168
166
 
169
-
170
-
171
167
  printf("\n");
172
168
 
173
- for(i=0;i<tate;i++){
174
-
175
- for(j=0;j<yoko;j++){
176
-
177
- printf("%c", x[i][j]);
178
-
179
- }
180
-
181
- printf("\n");
182
-
183
- }
184
-
185
-
186
-
187
169
  exit(0);
188
170
 
189
171
  }
@@ -553,3 +535,11 @@
553
535
  }
554
536
 
555
537
  ```
538
+
539
+
540
+
541
+ zikken.txtが簡単なケースなので「S~G」まで辿り着きます。右手壁伝いのロジックです。
542
+
543
+ できればファイルを載せて頂けると原因が分かると思います。
544
+
545
+ ファイルはCRLFですよね。またマシンスペックは充分だと思います私のは、core5(8G)です。

4

追加

2017/05/08 16:44

投稿

A.Ichi
A.Ichi

スコア4070

test CHANGED
@@ -24,6 +24,8 @@
24
24
 
25
25
  int olist=0;
26
26
 
27
+ int muki=0;
28
+
27
29
 
28
30
 
29
31
  struct queue{
@@ -42,24 +44,14 @@
42
44
 
43
45
  int i;
44
46
 
45
-
46
-
47
47
  q->head=0;
48
48
 
49
49
  q->tail=0;
50
50
 
51
- for(i=0; i < N; ++i){
52
-
53
- q->data[i]=0;
54
-
55
- }
56
-
57
51
  }
58
52
 
59
53
 
60
54
 
61
-
62
-
63
55
  void enqueue(struct queue *q, int i){
64
56
 
65
57
 
@@ -106,8 +98,6 @@
106
98
 
107
99
  j=q->data[q->tail-1];
108
100
 
109
- q->data[q->tail-1]=0;
110
-
111
101
  q->tail--;
112
102
 
113
103
  qcounter--;
@@ -120,11 +110,45 @@
120
110
 
121
111
 
122
112
 
123
-
113
+ int houkou(struct queue *q){
114
+
124
-
115
+ int j;
116
+
117
+
118
+
125
-
119
+ if(q->head == q->tail){
120
+
126
-
121
+ return -1;
122
+
123
+ }else if (q->data[q->tail+1] == q->data[q->tail-1]){
124
+
125
+ if ( q->data[q->tail] > q->data[q->tail-2] ){
126
+
127
+ j=2;
128
+
129
+ }else{
130
+
131
+ j=0;
132
+
133
+ }
134
+
135
+ }else if(q->data[q->tail+1] > q->data[q->tail-1]){
136
+
137
+ j=3;
138
+
139
+ }else{
140
+
141
+ j=1;
142
+
143
+ }
144
+
145
+ return j;
146
+
147
+ }
148
+
149
+
150
+
127
- void next(char x[101][101] , int s, int t, struct queue *Q){
151
+ void next(char x[101][101] , int s, int t, struct queue *Q, int muki){
128
152
 
129
153
  int i, j;
130
154
 
@@ -166,228 +190,366 @@
166
190
 
167
191
 
168
192
 
193
+ switch (muki) { /* 下:0 右:1 上:2 左:3*/
194
+
195
+ case 0: /* 下向き */
196
+
197
+ if (x[s][t-1] == '0'){ /*左へとループ 3*/
198
+
199
+ x[s][t-1] = '2';
200
+
201
+ olist++;
202
+
203
+ t = t-1;
204
+
205
+ printf("current position:%d,%d", s, t); //現在の座標を表示
206
+
207
+ enqueue(Q, s);
208
+
209
+ enqueue(Q, t);
210
+
211
+ muki = 3;
212
+
169
- if(x[s+1][t] == '0'){ /*下へとループ*/
213
+ }else if(x[s+1][t] == '0'){ /*下へとループ 0*/
170
214
 
171
215
  x[s+1][t] = '2';
172
216
 
173
217
  olist++;
174
218
 
175
-
219
+ s = s+1;
220
+
221
+ printf("current position:%d,%d", s, t); //現在の座標を表示
222
+
223
+ enqueue(Q, s);
224
+
225
+ enqueue(Q, t);
226
+
227
+ muki = 0;
228
+
229
+ }else if(x[s][t+1] == '0'){ /*右へとループ 1*/
230
+
231
+ x[s][t+1] = '2';
232
+
233
+ olist++;
234
+
235
+ t = t+1;
236
+
237
+ printf("current position:%d,%d", s, t); //現在の座標を表示
238
+
239
+ enqueue(Q, s);
240
+
241
+ enqueue(Q, t);
242
+
243
+ muki = 1;
244
+
245
+ }else{
246
+
247
+ t = dequeue(Q);
248
+
249
+ s = dequeue(Q);
250
+
251
+ muki = houkou(Q);
252
+
253
+ }
254
+
255
+ break;
256
+
257
+ case 1: /* 右向き */
258
+
259
+ if(x[s+1][t] == '0'){ /*下へとループ 0*/
260
+
261
+ x[s+1][t] = '2';
262
+
263
+ olist++;
264
+
265
+ s = s+1;
266
+
267
+ printf("current position:%d,%d", s, t); //現在の座標を表示
268
+
269
+ enqueue(Q, s);
270
+
271
+ enqueue(Q, t);
272
+
273
+ muki = 0;
274
+
275
+ }else if (x[s][t+1] == '0'){ /*右へとループ 1*/
276
+
277
+ x[s][t+1] = '2';
278
+
279
+ olist++;
280
+
281
+ t = t+1;
282
+
283
+ printf("current position:%d,%d", s, t); //現在の座標を表示
284
+
285
+ enqueue(Q, s);
286
+
287
+ enqueue(Q, t);
288
+
289
+ muki = 1;
290
+
291
+ }else if (x[s-1][t] == '0'){ /*上へとループ 2*/
292
+
293
+ x[s-1][t] = '2';
294
+
295
+ olist++;
296
+
297
+ s = s-1;
298
+
299
+ printf("current position:%d,%d", s, t); //現在の座標を表示
300
+
301
+ enqueue(Q, s);
302
+
303
+ enqueue(Q, t);
304
+
305
+ muki = 2;
306
+
307
+ }else{
308
+
309
+ t = dequeue(Q);
310
+
311
+ s = dequeue(Q);
312
+
313
+ muki = houkou(Q);
314
+
315
+ }
316
+
317
+ break;
318
+
319
+ case 2: /* 上向き */
320
+
321
+ if (x[s][t+1] == '0'){ /*右へとループ 1*/
322
+
323
+ x[s][t+1] = '2';
324
+
325
+ olist++;
326
+
327
+ t = t+1;
328
+
329
+ printf("current position:%d,%d", s, t); //現在の座標を表示
330
+
331
+ enqueue(Q, s);
332
+
333
+ enqueue(Q, t);
334
+
335
+ muki = 1;
336
+
337
+ }else if (x[s-1][t] == '0'){ /*上へとループ 2*/
338
+
339
+ x[s-1][t] = '2';
340
+
341
+ olist++;
342
+
343
+ s = s-1;
344
+
345
+ printf("current position:%d,%d", s, t); //現在の座標を表示
346
+
347
+ enqueue(Q, s);
348
+
349
+ enqueue(Q, t);
350
+
351
+ muki = 2;
352
+
353
+ }else if (x[s][t-1] == '0'){ /*左へとループ 3*/
354
+
355
+ x[s][t-1] = '2';
356
+
357
+ olist++;
358
+
359
+ t = t-1;
360
+
361
+ printf("current position:%d,%d", s, t); //現在の座標を表示
362
+
363
+ enqueue(Q, s);
364
+
365
+ enqueue(Q, t);
366
+
367
+ muki = 3;
368
+
369
+ }else{
370
+
371
+ t = dequeue(Q);
372
+
373
+ s = dequeue(Q);
374
+
375
+ muki = houkou(Q);
376
+
377
+ }
378
+
379
+ break;
380
+
381
+ case 3: /* 左向き */
382
+
383
+ if (x[s-1][t] == '0'){ /*上へとループ 2*/
384
+
385
+ x[s-1][t] = '2';
386
+
387
+ olist++;
388
+
389
+ s = s-1;
390
+
391
+ printf("current position:%d,%d", s, t); //現在の座標を表示
392
+
393
+ enqueue(Q, s);
394
+
395
+ enqueue(Q, t);
396
+
397
+ muki = 2;
398
+
399
+ }else if (x[s][t-1] == '0'){ /*左へとループ 3*/
400
+
401
+ x[s][t-1] = '2';
402
+
403
+ olist++;
404
+
405
+ t = t-1;
406
+
407
+ printf("current position:%d,%d", s, t); //現在の座標を表示
408
+
409
+ enqueue(Q, s);
410
+
411
+ enqueue(Q, t);
412
+
413
+ muki = 3;
414
+
415
+ }else if(x[s+1][t] == '0'){ /*下へとループ 0*/
416
+
417
+ x[s+1][t] = '2';
418
+
419
+ olist++;
420
+
421
+ s = s+1;
422
+
423
+ printf("current position:%d,%d", s, t); //現在の座標を表示
424
+
425
+ enqueue(Q, s);
426
+
427
+ enqueue(Q, t);
428
+
429
+ muki = 0;
430
+
431
+ }else{
432
+
433
+ t = dequeue(Q);
434
+
435
+ s = dequeue(Q);
436
+
437
+ muki = houkou(Q);
438
+
439
+ }
440
+
441
+ break;
442
+
443
+ default:
444
+
445
+ exit(2);
446
+
447
+ break;
448
+
449
+ }
450
+
451
+
452
+
453
+ printf("\n");
454
+
455
+ for(i=0;i<tate;i++){
456
+
457
+ for(j=0;j<yoko;j++){
458
+
459
+ printf("%c", x[i][j]);
460
+
461
+ }
176
462
 
177
463
  printf("\n");
178
464
 
179
- for(i=0;i<tate;i++){
180
-
181
- for(j=0;j<yoko;j++){
182
-
183
- printf("%c", x[i][j]);
184
-
185
- }
465
+ }
186
-
466
+
467
+
468
+
187
- printf("\n");
469
+ next(x, s, t, Q, muki);
188
-
470
+
471
+
472
+
189
- }
473
+ }
190
-
191
-
192
-
193
- s = s+1;
474
+
194
-
195
- printf("current position:%d,%d", s, t); //現在の座標を表示
475
+
196
-
476
+
477
+
478
+
197
- enqueue(Q, s);
479
+ void main(){
198
-
480
+
199
- enqueue(Q, t);
481
+ int s=0, t=0;
482
+
200
-
483
+ int flag=0;
484
+
485
+ char data[yoko][tate];
486
+
487
+ char mozi;
488
+
201
- }else if (x[s][t+1] == '0'){ /*右へとープ*/
489
+ FILE *fp; /*ファイポインタ*/
490
+
491
+
492
+
202
-
493
+ fp = fopen("zikken.txt","r");
494
+
495
+ for(s=0;s<tate;s++){
496
+
497
+ for(t=0;t<yoko;t++){
498
+
203
- x[s][t+1] = '2';
499
+ data[s][t] = fgetc(fp);
500
+
204
-
501
+ }
502
+
205
- olist++;
503
+ mozi = fgetc(fp);
504
+
206
-
505
+ mozi = fgetc(fp);
506
+
207
-
507
+ }
508
+
509
+
510
+
511
+ for(s=0;s<tate;s++){
512
+
513
+ for(t=0;t<yoko;t++){
514
+
515
+ printf("%c", data[s][t]);
516
+
517
+ }
208
518
 
209
519
  printf("\n");
210
520
 
211
- for(i=0;i<tate;i++){
212
-
213
- for(j=0;j<yoko;j++){
214
-
215
- printf("%c", x[i][j]);
216
-
217
- }
218
-
219
- printf("\n");
220
-
221
- }
222
-
223
-
224
-
225
- t = t+1;
226
-
227
- printf("current position:%d,%d", s, t); //現在の座標を表示
228
-
229
- enqueue(Q, s);
230
-
231
- enqueue(Q, t);
232
-
233
- }else if (x[s-1][t] == '0'){ /*上へとループ*/
234
-
235
- x[s-1][t] = '2';
236
-
237
- olist++;
238
-
239
-
240
-
241
- printf("\n");
242
-
243
- for(i=0;i<tate;i++){
244
-
245
- for(j=0;j<yoko;j++){
246
-
247
- printf("%c", x[i][j]);
248
-
249
- }
250
-
251
- printf("\n");
252
-
253
- }
254
-
255
-
256
-
257
- s = s-1;
258
-
259
- printf("current position:%d,%d", s, t); //現在の座標を表示
260
-
261
- enqueue(Q, s);
262
-
263
- enqueue(Q, t);
264
-
265
- }else if (x[s][t-1] == '0'){ /*上へとループ*/
266
-
267
- x[s][t-1] = '2';
268
-
269
- olist++;
270
-
271
-
272
-
273
- printf("\n");
274
-
275
- for(i=0;i<tate;i++){
276
-
277
- for(j=0;j<yoko;j++){
278
-
279
- printf("%c", x[i][j]);
280
-
281
- }
282
-
283
- printf("\n");
284
-
285
- }
286
-
287
-
288
-
289
- t = t-1;
290
-
291
- printf("current position:%d,%d", s, t); //現在の座標を表示
292
-
293
- enqueue(Q, s);
294
-
295
- enqueue(Q, t);
296
-
297
- }else{
298
-
299
- t = dequeue(Q);
300
-
301
- s = dequeue(Q);
302
-
303
- }
304
-
305
-
306
-
307
- next(x, s, t, Q);
308
-
309
-
521
+ }
522
+
523
+
524
+
525
+ fclose(fp);
526
+
527
+
528
+
529
+ s=1; t=1; /*スタート地点*/
530
+
531
+ data[s][t] = 'S';
532
+
533
+ data[yoko-2][tate-2] = 'G';
534
+
535
+
536
+
537
+ struct queue Q;
538
+
539
+
540
+
541
+ initialize(&Q);
542
+
543
+
544
+
545
+
546
+
547
+ next(data, s, t, &Q, muki);
548
+
549
+
550
+
551
+ return;
310
552
 
311
553
  }
312
554
 
313
-
314
-
315
-
316
-
317
- void main(){
318
-
319
- int s=0, t=0;
320
-
321
- int flag=0;
322
-
323
- char data[yoko][tate];
324
-
325
- char mozi;
326
-
327
- FILE *fp; /*ファイルポインタ*/
328
-
329
-
330
-
331
- fp = fopen("zikken.txt","r");
332
-
333
- for(s=0;s<tate;s++){
334
-
335
- for(t=0;t<yoko;t++){
336
-
337
- data[s][t] = fgetc(fp);
338
-
339
- }
340
-
341
- mozi = fgetc(fp);
342
-
343
- mozi = fgetc(fp);
344
-
345
- }
346
-
347
-
348
-
349
- for(s=0;s<tate;s++){
350
-
351
- for(t=0;t<yoko;t++){
352
-
353
- printf("%c", data[s][t]);
354
-
355
- }
356
-
357
- printf("\n");
358
-
359
- }
360
-
361
-
362
-
363
- fclose(fp);
364
-
365
-
366
-
367
- s=1; t=1; /*スタート地点*/
368
-
369
- data[s][t] = 'S';
370
-
371
- data[yoko-2][tate-2] = 'G';
372
-
373
-
374
-
375
- struct queue Q;
376
-
377
-
378
-
379
- initialize(&Q);
380
-
381
-
382
-
383
-
384
-
385
- next(data, s, t, &Q);
386
-
387
-
388
-
389
- return;
390
-
391
- }
392
-
393
555
  ```

3

変更

2017/05/08 07:11

投稿

A.Ichi
A.Ichi

スコア4070

test CHANGED
@@ -104,9 +104,11 @@
104
104
 
105
105
  }else{
106
106
 
107
- j=q->data[q->head];
107
+ j=q->data[q->tail-1];
108
+
108
-
109
+ q->data[q->tail-1]=0;
110
+
109
- q->head++;
111
+ q->tail--;
110
112
 
111
113
  qcounter--;
112
114
 
@@ -294,10 +296,10 @@
294
296
 
295
297
  }else{
296
298
 
299
+ t = dequeue(Q);
300
+
297
301
  s = dequeue(Q);
298
302
 
299
- t = dequeue(Q);
300
-
301
303
  }
302
304
 
303
305
 

2

変更

2017/05/08 04:52

投稿

A.Ichi
A.Ichi

スコア4070

test CHANGED
@@ -12,7 +12,7 @@
12
12
 
13
13
  #define tate 101 /*縦*/
14
14
 
15
- #define N yoko * tate
15
+ #define N yoko * tate * 2
16
16
 
17
17
 
18
18
 

1

変更

2017/05/08 04:10

投稿

A.Ichi
A.Ichi

スコア4070

test CHANGED
@@ -292,74 +292,72 @@
292
292
 
293
293
  enqueue(Q, t);
294
294
 
295
- return;
295
+ }else{
296
+
297
+ s = dequeue(Q);
298
+
299
+ t = dequeue(Q);
300
+
301
+ }
302
+
303
+
304
+
305
+ next(x, s, t, Q);
306
+
307
+
308
+
309
+ }
310
+
311
+
312
+
313
+
314
+
315
+ void main(){
316
+
317
+ int s=0, t=0;
318
+
319
+ int flag=0;
320
+
321
+ char data[yoko][tate];
322
+
323
+ char mozi;
324
+
325
+ FILE *fp; /*ファイルポインタ*/
326
+
327
+
328
+
329
+ fp = fopen("zikken.txt","r");
330
+
331
+ for(s=0;s<tate;s++){
332
+
333
+ for(t=0;t<yoko;t++){
334
+
335
+ data[s][t] = fgetc(fp);
336
+
337
+ }
338
+
339
+ mozi = fgetc(fp);
340
+
341
+ mozi = fgetc(fp);
296
342
 
297
343
  }
298
344
 
299
345
 
300
346
 
301
- next(x, s, t, Q);
302
-
303
-
304
-
305
- s = dequeue(Q);
306
-
307
- t = dequeue(Q);
308
-
309
-
310
-
311
- }
312
-
313
-
314
-
315
-
316
-
317
- void main(){
318
-
319
- int s=0, t=0;
320
-
321
- int flag=0;
322
-
323
- char data[yoko][tate];
324
-
325
- char mozi;
326
-
327
- FILE *fp; /*ファイルポインタ*/
328
-
329
-
330
-
331
- fp = fopen("zikken.txt","r");
332
-
333
347
  for(s=0;s<tate;s++){
334
348
 
335
349
  for(t=0;t<yoko;t++){
336
350
 
337
- data[s][t] = fgetc(fp);
351
+ printf("%c", data[s][t]);
338
-
352
+
339
- }
353
+ }
340
-
354
+
341
- mozi = fgetc(fp);
355
+ printf("\n");
342
-
343
- mozi = fgetc(fp);
344
356
 
345
357
  }
346
358
 
347
359
 
348
360
 
349
- for(s=0;s<tate;s++){
350
-
351
- for(t=0;t<yoko;t++){
352
-
353
- printf("%c", data[s][t]);
354
-
355
- }
356
-
357
- printf("\n");
358
-
359
- }
360
-
361
-
362
-
363
361
  fclose(fp);
364
362
 
365
363