2012-03-13 2 views
-3

Учитывая сетка из пХп квадратов, где каждый квадрат имеет идентификатор, первый (верхний левый) квадрат имеет идентификатор 0 (так 5x5 сетка есть идентификаторы 0-24), как показано ниже:TicTacToe - растворы генерации

00 01 02 03 04 

05 06 07 08 09 

10 11 12 13 14 

15 16 17 18 19 

20 21 22 23 24 

мне нужно генерировать все диагональные решения длины Y. Таким образом, если Y равен 3, то некоторые из решений будет:

0,6,12 

и

11,17,23 

, но, очевидно, НЕ

3,9,15 (because the 15 does not follow on diagonally) 

Любые идеи о том, как эти решения могут быть сгенерированы?

Это то, что у меня до сих пор (размер = 5, inARow = 3):

public ArrayList<int[]> getSolutions(int dimension, int inARow) { 

    ArrayList<int[]> solutions = new ArrayList<int[]>(); 

    //create row solutions 
    for(int i=0; i<dimension*dimension; i = i+dimension) { 
     for(int j=i; j<=i+dimension - inARow; j++){    
      int[] row = new int[inARow]; 
      int counter = 0; 
      for(int k=j; k<j+inARow; k++){ 
       row[counter++] = k; 
      } 
      solutions.add(row); 
     } 
    } 

    //create column solutions   
    for(int i=0;i<dimension;i++){ 
     for(int j=i; j<(dimension*dimension)-(dimension*inARow)+dimension;j=j+dimension){ 
      int[] col = new int[inARow]; 
      int counter = 0; 
      for(int k=j;k<j+(dimension*inARow);k=k+dimension){ 
       col[counter++] = k; 
      } 
      solutions.add(col); 
     } 
    } 

    //create diagonals   
    for(int i=0; i<dimension*dimension; i++){    
     for(int j=i; j<i+(dimension * inARow); j = j+dimension+1){ 
      System.out.println(j); 
     }    
    }     

    return solutions; 

Это дает мне все диагональные решения, но и дает мне плохие, как 3,9,15 , У меня проблемы с устранением этих проблем.

Антидиагонали также являются решениями, так что 2,6,10 также будет решением, но если я получу нормальные диагонали, я, возможно, сделаю то же самое для антидиагоналей.

+0

Каковы некоторые из ваших идей или вещей, которые вы пробовали? – AHungerArtist

+0

Это, наверное, очень просто для нас, однако какой код/​​алгоритм вы написали? – Woot4Moo

+1

Действительно ли решение 2, 6, 10? – emory

ответ

1

Это ваш счастливый день ... Я обновил ответ на работу в качестве общего решения для всех размеров сетки и длины

В кофе сценарий, который делает хороший псевдокод

w = 5 # width of the grid 
h = 5 # height of the grid 
l = 3 # length to capture 

m = [] # matches 

for i in [0..(w*h)-1] # loop through each square 
    col = i % w # calculate what column we are in 
    row = Math.floor i/w # calculate what row we are in 
    nums = [] # re-set matched lines array 
    if col < w - (l-1) and row < h - (l-1) # if there is space for diagonal right 
     for j in [0..l-1] # loop until length is reached 
      nums.push i+(j*w)+j # push it onto the array of squares 
     m.push nums # push into the array of matched lines 
    nums = [] 
    if col > l-2 and row < h-l+1 # if there is space for diagonal left 
     for j in [0..l-1] 
      nums.push i+(j*w)-j 
     m.push nums 

console.dir m 
# or 
console.log i.join "," for i in m 

Который компилирует на javascript (так что вы можете проверить его)

var col, h, i, j, l, m, nums, row, w, _i, _len, _ref, _ref2, _ref3; 
w = 5; 
h = 5; 
l = 3; 
m = []; 
for (i = 0, _ref = (w * h) - 1; 0 <= _ref ? i <= _ref : i >= _ref; 0 <= _ref ? i++ : i--) { 
    col = i % w; 
    row = Math.floor(i/w); 
    nums = []; 
    if (col < w - (l - 1) && row < h - (l - 1)) { 
    for (j = 0, _ref2 = l - 1; 0 <= _ref2 ? j <= _ref2 : j >= _ref2; 0 <= _ref2 ? j++ : j--) { 
     nums.push(i + (j * w) + j); 
    } 
    m.push(nums); 
    } 
    nums = []; 
    if (col > l - 2 && row < h - l + 1) { 
    for (j = 0, _ref3 = l - 1; 0 <= _ref3 ? j <= _ref3 : j >= _ref3; 0 <= _ref3 ? j++ : j--) { 
     nums.push(i + (j * w) - j); 
    } 
    m.push(nums); 
    } 
} 
console.dir(m); 
for (_i = 0, _len = m.length; _i < _len; _i++) { 
    i = m[_i]; 
    console.log(i.join(",")); 
} 
+0

Привет, проблема с этим кодом заключается в том, что он предполагает, что решение требует 3 квадрата. Это будет динамически решено вместе с размером платы, но может быть любым числом. –

+0

@King_Kratos Так что выясните это оттуда. Не ожидайте полного ответа на то, что вам нужно, только потому, что вы его просили. – AHungerArtist

+0

Этот ответ заставил меня убедить, что я должен изучить coffeescript. Можете ли вы порекомендовать учебник? – emory