2013-02-26 64 views
1

對於這個小片段,我產生一個隨機數,檢查它是否是行和列的一部分,如果它不是其中的一部分,它會插入數字。我知道它可能會放入一個已經在其3x3盒子中的數字,但這是我可以解決的問題。這是我的代碼片段,如果希望我編輯的整個代碼。我的整個代碼大概有100行。Sudoku求解器,小片段問題(matlab)

% 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)我仍然看到有多個相同數字的行和列。

謝謝你們。

+0

你有一個'board'的例子,它不起作用嗎?在一些隨機板上運行約100次,我沒有看到任何11。沒有在一行或一列中檢查所有這些數字,但沒有看到我檢查過的數字。代碼似乎應該工作.. – ThijsW 2013-02-26 06:40:53

+0

當然,我使用的謎是這個頁面上的第一個難題; http://theory.tifr.res.in/~sgupta/sudoku/algo.html – 2013-02-26 06:53:30

回答

1

我不知道爲什麼你的代碼會導致行或列重複,爲什麼你會看到11,所以這可能不完全是你的問題的答案,但它可能會幫助你。我修改了一下你的代碼,不僅嘗試了一個隨機數,而且嘗試了所有數字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 
+0

那麼從我跑過的測試中看,這看起來確實有效。非常感謝,我非常感謝幫助。我仍然不明白我的代碼出錯的地方;但我確實明白你在編寫代碼時做了什麼。你救了我頭痛一半。 – 2013-02-26 07:21:07

+0

不客氣。再說一遍:你描述的問題對我來說確實是個謎。即使在您給我的網站上的板子上,也沒有發生過一次(使用您的代碼!)。 – ThijsW 2013-02-26 07:26:24