ファイルの準備と読込み

 ファイルから入力して配列に入れ込む作業をしたいと思います。 入力ファイルはカンマで区切るようにして保存するようにします。(0は未確定の数字。)
--例--
0,0,5,3,6,0,4,0,0
9,6,2,0,0,4,0,7,0
3,0,4,0,2,9,0,6,0
8,2,0,9,4,0,0,1,3
0,4,9,0,3,0,0,5,7
0,0,0,2,0,0,9,8,0
4,0,6,0,0,1,0,0,2
0,0,0,6,9,3,0,0,5
0,0,3,0,8,0,0,0,0
 このファイルを読み込むようにプログラムしていきます。 c言語でファイルを読み込ませる方法はファイルの読込み を参照して下さい。

2つの配列を準備します。
@item[row][col][n]
0:nが(row,col)に入らない。1:nが(row,col)に入る可能性がある。
Aconf_item[row][col]
0〜9 確定した数字を入れる。0:未定、1〜9:確定した数字。

Step1 初期化
 配列を準備した後、初期化をしていきます。conf_itemは確定した数字がないとしてすべての配列に0を入れる。itemにはすべての数字が入る可能性があるのですべての配列内に1を入れます。

Step2 ファイルを読み込んで配列内に数字を入れる。
 入力された数字が0以外であれば確定しているのでconf_item内に数字を入れます。数字が確定るのでitemの配列に0を入れます。0であれば数字が確定していないのでconf_itemは0のままで、itemもすべての配列内に1を入れたままにします。

 最後にきちんと読み込めたかコマンドラインに出力と、出力ファイルを準備して読み込んだ数字を出力してみます。 このように動くようにプログラミングした内容を以下に書いておきます。

 ※これではすべてのマスを埋められなくても終了となってしまいます。 また、深く探索はしないので効率も悪くなってしまいます。そこは次に考えていきたいと思います。

ファイルの読込み(ソースコード)


#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define ROW 10
#define COL 10
#define N 10

int main(int argc, char* argv[]) {
    int i, j, n, row, col, cnt = 0;
    int item[ROW][COL][N], conf_item[ROW][COL];
    char gomi[100];
    FILE  *Input_File, *Output_File;
 
    /*Step1 初期化*/
    for (row = 0; row < ROW; row++) {
        for (col = 0; col < COL; col++) {
            conf_item[row][col] = 0;/*初期は未定*/
            for (n = 0; n < N; n++) {
                item[row][col][n] = 1;/*初期はすべての数字に可能性がある*/
            }
        }
    }
 
    /*---File準備---*/
    /*in*/
    if (fopen_s(&Input_File, argv[1], "r")) {
        printf("FILE OPEN FAILURE!!\n");
    }

    /*out*/
    if (fopen_s(&Output_File, "out.txt", "w")) {
        printf("FILE OPEN FAILURE!!\n");
    }
    printf("-----%s-----\n", argv[1]);
    /*---File準備終わり---*/

    /*---Step2 File読み込み---*/
    for (row = 1; row < ROW; row++) {
        /*conf_itemに入力データを入れ込む*/
        fscanf_s(Input_File, "%d,%d,%d,%d,%d,%d,%d,%d,%d\n", 
				&conf_item[row][1], &conf_item[row][2], &conf_item[row][3],
				&conf_item[row][4], &conf_item[row][5], &conf_item[row][6],
				&conf_item[row][7], &conf_item[row][8], &conf_item[row][9]);
    }

    /*itemに入力データを入れ込む。確定しているマスには該当する数字のitemに1、それ以外のitemに0を入れる。*/
    printf_s("Input_File\n");
    fprintf_s(Output_File, "Input_File\n");
    for (row = 1; row < ROW; row++) {
        for (col = 1; col < COL; col++) {
            if (conf_item[row][col] != 0) {
                for (n = 0; n < N; n++) {
                    item[row][col][n] = 0;
                }
                item[row][col][conf_item[row][col]] = 1;
            }
            printf_s("%d,", conf_item[row][col]);
            fprintf_s(Output_File, "%d,", conf_item[row][col]);/*出力ファイルに入力データを出力*/
        }
        printf_s("\n");
        fprintf_s(Output_File, "\n");
    }

    /*---item入力完了---*/
    fclose(Input_File);

    /*---File読み込み終わり---*/
    fclose(Input_File);
    fclose(Output_File);

    /*--コマンドライン停止用、意味はない--*/
    scanf_s("%s", gomi, 100);
}

<<0.考え方      >>1_1.ソースコードの詳細説明     >>2.判定式の作成