質問編集履歴

3

修正後の掲載

2020/11/09 16:51

投稿

7sstrictly
7sstrictly

スコア2

test CHANGED
File without changes
test CHANGED
@@ -44,8 +44,6 @@
44
44
 
45
45
  ```
46
46
 
47
-
48
-
49
47
  #include<iostream>
50
48
 
51
49
  #include <fstream>
@@ -308,7 +306,11 @@
308
306
 
309
307
  ```
310
308
 
309
+
310
+
311
- 修正後
311
+ 以下修正後です
312
+
313
+
312
314
 
313
315
 
314
316
 
@@ -316,6 +318,8 @@
316
318
 
317
319
 
318
320
 
321
+
322
+
319
323
  #include<iostream>
320
324
 
321
325
  #include <fstream>
@@ -554,4 +558,6 @@
554
558
 
555
559
  }
556
560
 
561
+
562
+
557
- ```
563
+ ```

2

修正後の掲載

2020/11/09 16:51

投稿

7sstrictly
7sstrictly

スコア2

test CHANGED
File without changes
test CHANGED
@@ -307,3 +307,251 @@
307
307
 
308
308
 
309
309
  ```
310
+
311
+ 修正後
312
+
313
+
314
+
315
+ ```
316
+
317
+
318
+
319
+ #include<iostream>
320
+
321
+ #include <fstream>
322
+
323
+ #include <string>
324
+
325
+ using namespace std;
326
+
327
+
328
+
329
+ #define ROWS 3 // ブロックサイズ
330
+
331
+ #define COLS 3
332
+
333
+ #define M (ROWS*COLS) // 問題図の大きさ
334
+
335
+ int mat[M][M]; // 0:空きマス,1~9:確定数字
336
+
337
+
338
+
339
+ int check( int row, int col, int k) // mat[row][col] に k を置けるか?
340
+
341
+ {
342
+
343
+ int rowBlock, colBlock;
344
+
345
+ int xrow, xcol;
346
+
347
+
348
+
349
+ for( xrow=0; xrow< M; xrow++) { // 同じ行にkが使われていないか?
350
+
351
+ if( mat[xrow][col] == k) return 0;
352
+
353
+ }
354
+
355
+ for( xcol=0; xcol< M; xcol++) { // 同じ列にkが使われていないか?
356
+
357
+ if( mat[row][xcol] == k) return 0;
358
+
359
+ }
360
+
361
+ // 同じブロックにkが使われていないか?
362
+
363
+ rowBlock = row/ROWS*ROWS;
364
+
365
+ colBlock = col/COLS*COLS;
366
+
367
+ for( xrow=0; xrow<ROWS; xrow++) {
368
+
369
+ for( xcol=0; xcol< COLS; xcol++) {
370
+
371
+ if( mat[rowBlock+xrow][colBlock+xcol] == k){
372
+
373
+ return 0;
374
+
375
+ }
376
+
377
+ }
378
+
379
+ }
380
+
381
+ return 1;
382
+
383
+ }
384
+
385
+
386
+
387
+ void printdata()
388
+
389
+ {
390
+
391
+ for( int row=0; row< M; row++) {
392
+
393
+ for( int col=0; col< M; col++) {
394
+
395
+ cout<<mat[row][col]<<" ";
396
+
397
+ }
398
+
399
+ cout<<endl;
400
+
401
+ }
402
+
403
+ }
404
+
405
+
406
+
407
+ void backtr( int p) // 調査位置p
408
+
409
+ {
410
+
411
+ if( p >= M*M) {//調査完了
412
+
413
+ cout<< "find"<<endl;
414
+
415
+ printdata(); // 解答図を出力する
416
+
417
+ return;
418
+
419
+ }
420
+
421
+ int row, col, k;
422
+
423
+ row = p/M; // 調査位置pを[行][列]に変換
424
+
425
+ col = p%M;
426
+
427
+ if( mat[row][col]) {
428
+
429
+ backtr( p+1);
430
+
431
+ }
432
+
433
+ else {
434
+
435
+ for( k=1; k<= M; k++) {
436
+
437
+ if( check( row, col, k)) {
438
+
439
+ mat[row][col] = k;
440
+
441
+ backtr( p+1);
442
+
443
+ mat[row][col] = 0;
444
+
445
+ }
446
+
447
+ }
448
+
449
+ }
450
+
451
+ }
452
+
453
+
454
+
455
+ int setdata(int row, string s){// 指定行に問題を入力
456
+
457
+ if(s.size() != M){
458
+
459
+ cout<<"Number of columns(" << s.size() << ")not fit"<<endl;
460
+
461
+ return 1;
462
+
463
+ }
464
+
465
+ for(int col = 0; col < M; col++) {
466
+
467
+ if (s[col] >= '0' && s[col] <= '9') {
468
+
469
+ mat[row][col] = s[col] - '0';
470
+
471
+ }
472
+
473
+ else {
474
+
475
+ cout<<"Unable to recognize data characters"<<endl;
476
+
477
+ return 1;
478
+
479
+ }
480
+
481
+ }
482
+
483
+ return 0;
484
+
485
+ }
486
+
487
+
488
+
489
+ int readdata(string name)
490
+
491
+ {
492
+
493
+ ifstream fin("input.dat");
494
+
495
+
496
+
497
+ if(fin.fail()){
498
+
499
+ cout << "Unable to open input file" << endl;
500
+
501
+ return 1;
502
+
503
+ }
504
+
505
+
506
+
507
+ string s;
508
+
509
+ int row = 0;
510
+
511
+ while (getline(fin, s)) {
512
+
513
+ if( setdata(row,s) == 1) return 1;
514
+
515
+ row++;
516
+
517
+ }
518
+
519
+ if( row != M) {
520
+
521
+ cout<<"The number of lines does not match. Expected value "<<endl;
522
+
523
+ return 1;
524
+
525
+ }
526
+
527
+ return 0;
528
+
529
+ }
530
+
531
+
532
+
533
+ int main(int argc, const char* argv[])
534
+
535
+ {
536
+
537
+ if(argc != 2) {
538
+
539
+ cout<<"Please specify the data "<<endl;
540
+
541
+ exit(0);
542
+
543
+ }
544
+
545
+ if (!readdata(argv[1])) { // 問題図読み込み
546
+
547
+ printdata(); // 問題図出力
548
+
549
+ backtr(0); //[0][0]から虱潰しで検索する(バックトラック呼び出し)
550
+
551
+ }
552
+
553
+ return 0;
554
+
555
+ }
556
+
557
+ ```

1

入力例を追記しました。

2020/11/09 16:49

投稿

7sstrictly
7sstrictly

スコア2

test CHANGED
@@ -1 +1 @@
1
- C++ ファイルの入力の仕方について
1
+ 入力C++ ファイルの入力の仕方について
test CHANGED
@@ -1,6 +1,6 @@
1
1
  こんばんは、夜分遅くに失礼します。
2
2
 
3
- 現在9*9のパズルの問題を入力させたくC+でコードを稚拙にも書いていたのですが、うまく動かず(コンパイルエラー)こちらで質問させて頂きました。
3
+ 現在9*9のパズルの問題(ナンプレ)を入力させたくC+でコードを稚拙にも書いていたのですが、うまく動かず(コンパイルエラー)こちらで質問させて頂きました。
4
4
 
5
5
 
6
6
 
@@ -16,6 +16,30 @@
16
16
 
17
17
 
18
18
 
19
+ 入力例ファイル
20
+
21
+
22
+
23
+ 100700600
24
+
25
+ 020000050
26
+
27
+ 003009000
28
+
29
+ 700400008
30
+
31
+ 000050020
32
+
33
+ 000006100
34
+
35
+ 402100700
36
+
37
+ 000007080
38
+
39
+ 600020009
40
+
41
+
42
+
19
43
 
20
44
 
21
45
  ```