0

main.m

counter = 1;
n = 8;
board = zeros(1,n);
back(0, board);
disp(counter);

sol.m

function value = sol(board)

for ( i = 1:(length(board)))
   for ( j = (i+1): (length(board)-1))
       if (board(i) == board(j))
          value = 0;
          return;
       end
       if ((board(i) - board(j)) == (i-j))
          value = 0;
          return;
       end
       if ((board(i) - board(j)) == (j-i))
          value = 0;
          return;
       end
   end
end
value = 1;
return;

バック.m

function back(depth, board)

disp(board);

if ( (depth == length(board)) && (sol2(board) == 1))
    counter = counter + 1;
end

if ( depth < length(board))
   for ( i = 0:length(board))
       board(1,depth+1) = i;
       depth = depth + 1;
       solv2(depth, board);
   end
end

クイーンが互いに攻撃しないように、n x n のボードに n クイーンを配置できる最大数を見つけようとしています。上記のmatlabコードの問題を理解できません.javaでこのロジックをテストしたので、ロジックの問題ではないかと思います.そこでは完全にうまく機能しているようです. コードはコンパイルされますが、生成される結果が間違っているという問題があります。

動作するJavaコード:

               public static int counter=0;

                public static boolean isSolution(final int[] board){
                    for (int i = 0; i < board.length; i++) {
                        for (int j = i + 1; j < board.length; j++) {
                            if (board[i] == board[j]) return false;    
                            if (board[i]-board[j] == i-j) return false; 
                            if (board[i]-board[j] == j-i) return false; 
                        }
                    }
                    return true;
                }

                public static void solve(int depth, int[] board){

                    if (depth == board.length && isSolution(board)) {
                        counter++;
                 }
               if (depth < board.length) {  // try all positions of the next row

                for (int i = 0; i < board.length; i++) {
                            board[depth] = i;
                            solve(depth + 1, board);
                        }
                    }
                }


                    public static void main(String[] args){
                        int n = 8;
                        solve(0, new int[n]);
                    System.out.println(counter);
                    }
4

2 に答える 2

2

コードには多くの問題があります。

以下にいくつかを示します。

  • board1 行 8 列の配列として初期化する
  • あなたは関数を呼び出しsol2solv2それは未定義です
  • solv2, orの出力はキャプチャされませんback(Matlab は参照ではなく値で変数を渡すことを思い出してください)
  • コードには、何をしているのか、なぜそうしたいのかを説明するコメントはありません。

また、Matlab には JIT コンパイラがあり、特にループの高速化に役立ちますが、Matlab コードを「コンパイル」することはできません (何か劇的に間違っている場合を除きます)。

于 2010-06-11T01:56:48.290 に答える
2

働いたコード:

function queen
clc;
counter = 0;
n = 8;
board = zeros(1,n);
[board,counter] = back(1, board,counter);
fprintf('Solution count: %d\n',counter);
%%
function value =  isSolution(board)

for  i = 1:length(board)
   for  j = (i+1): length(board)
       if abs(board(i) - board(j)) == abs(i-j)
          value = false;
          return;
       end      
   end
end
value = true;
%%
function [board,counter] =  back(depth, board,counter)

if  (depth == length(board)+1) && isSolution(board)
    counter = counter + 1;
    disp(board);
end

if ( depth <= length(board))
   for  i = 1:length(board)
       if ~any(board==i)
           board(1,depth) = i;           
           [~,counter] = back(depth+1, board,counter);
       end       
   end
end

if ~any(board==i) の行を追加します。このチェックがなければ、あなたの Java ソリューションはこの Matlab コードよりも遅いと思います。最速の解決策については、「ダンシングリンク」をグーグルで検索してください。

于 2010-06-11T12:17:22.833 に答える