1

この小さなスニペットでは、乱数を生成し、それが行と列の一部であるかどうかを確認します。どちらの一部でもない場合は、乱数を挿入します。すでに3x3のボックスに入っている番号を入れる可能性があることは知っていますが、それは私が修正できる問題です。これが私のスニペットです。コード全体が必要な場合は編集します。私のコード全体は約100行です。

% Find empty slots, generate random number 1 - 9, insert into slot.
for i=1:9
    for j=1:9
        number = board(i,j);
        answer = ceil(9*rand(1,1));
        row = board(i,:);
        col = board(:,j);
        if number==0 && (ismember(answer,row)==0) && (ismember(answer,col)==0)
                board(i,j) = answer;
        end
    end
end

私の問題は、これを実際の未解決のパズルで実行したとき、1)スロットに11が挿入されたということですが、それはどのように可能ですか?2)同じ番号が複数ある行と列がまだ表示されます。

君たちありがとう。

4

1 に答える 1

1

なぜあなたのコードが行や列に重複をもたらすのか、そしてなぜあなたが11を見るのかはわかりません。したがって、これはあなたの質問に対する正確な答えではないかもしれませんが、あなたを助けるかもしれません。コードを少し変更して、1つの乱数を試すだけでなく、1〜9のすべての数字を(ランダムな順序で)試します。

for i=1:9
    for j=1:9
        tried = [];
        while board(i,j)==0
            newRand = 0;
            while ~newRand
                answer = ceil(9*rand);
                if ~ismember(answer,tried)
                    newRand = 1;
                end
            end
            row = board(i,:);
            col = board(:,j);
            if (ismember(answer,row)==0) && (ismember(answer,col)==0)
                board(i,j) = answer;
            else
                tried = [tried answer];
                if length(tried)==9
                    break;
                end
            end
        end
    end
end
于 2013-02-26T07:02:36.440 に答える