0

私は C を学んでいるので、数独ソルバーを書くことにしました。解決されたボードを返すために解決関数を取得するのに問題があります。問題は再帰関数呼び出しにあると思います。

ボードを文字列として渡し、ボードの最初の "0" のインデックスを見つけ、そのインデックスを使用して位置の可能な値のリストを作成します。次に、可能性を反復処理し、元のボードをコピーしてゼロを可能性に置き換え、新しいボードを再帰的にソルブ関数に渡します。コードは以下のとおりです。

char *solve(char *board)
{
    int zero = strcspn(board, "0");
    if(zero > 80) {
        return board;
    } else {
        char *possibilities = getPossibilities(zero, board);
        if(possibilities != '\0') {
            for(int i = 0; i < strlen(possibilities); i++) {
                char *new_string = malloc(strlen(board) * sizeof(char));
                memcpy(new_string, board, strlen(board));
                new_string[zero] = possibilities[i];
                return solve(new_string);
            }
        }
    }

}

理想的には、文字列に「0」がなくなったときに関数が戻る必要があります。ただし、次のような奇妙な出力が得られます。

The string is �96245781100060004504810390007950043030080000405023018010630059059070830003590007

私は問題に目を向けるのに苦労しています。プログラムの完全な要旨はこちらです。任意の入力が大好きです。前もって感謝します!

4

1 に答える 1

0

char *new_string = malloc(strlen(board) * sizeof(char));

'\0' 終端文字を割り当て、それを次のように変更する必要があります。

char *new_string = malloc(strlen(board) + 1);

に変更memcpyしますstrcpy

char * strcpy (new_string, board);

于 2013-10-15T01:15:26.623 に答える