2010-06-10 4 views
0

main.mMatlab N-Queen Проблема

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; 

back.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-qu een может быть размещен на доске n-by-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); 
        } 
+0

Является ли рабочий код Java достаточно коротким для публикации, чтобы сделать сравнение, чтобы увидеть, что пошло не так в переводе? – corsiKa

+0

уверенная вещь, дайте мне сек. – Kay

+0

Научитесь писать код без for-loops в matlab. петли медленны в матлабе. – ypnos

ответ

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 

Я добавить строку, если ~ любой (плата == я), без этой проверки, я думаю, что ваш Java решение медленнее, чем это Matlab код. Для быстрого решения google «Танцевальные ссылки».

2

Есть много проблем с вашим кодом.

Вот лишь некоторые из них:

  • инициализации board в 1-на-8 массив
  • вызове функции sol2 и solv2, которые являются неопределенными
  • вывод не захватывается для solv2 или back (помните, Matlab передает переменные по значению, а не по ссылке)
  • в коде нет комментариев, которые объясняли бы, что вы думаете, что вы делаете, и почему вы хотите сделай это.

Также: Хотя Matlab имеет JIT-компилятор, который, среди прочего, помогает ускорить цикл, код Matlab нельзя сказать «компилировать» (если вы не делаете что-то резко неправильное).

 Смежные вопросы

  • Нет связанных вопросов^_^