2014-10-11 6 views
1

Я пишу программу, которая находит максимальное количество путей, которые может предпринять контролер. Он начинается с плиток в стартовом ряду доски и заканчивается на плитки в конечной строке доски. Проблема в том, что я не могу понять, как сопоставить машиночитаемые метки плитки с человекочитаемыми метками плитки.Как найти начальную и конечную плитки проверки?

1 2 3 4   A B 
R|B|R|B   R|B|R|B 
B|R|B|R   B|R|B|R 
R|B|R|B   R|B|R|B 
B|R|B|R   B|R|B|R 
1 2 3 4   1 2 

Хотя моя программа вычисления пути, я хочу, чтобы иметь возможность видеть доску так, как это изображено на левой стороне. Однако, пока он находит конечную плитку с максимальным количеством путей, я хочу, чтобы она читала доску так, как она изображена справа. Я думаю о том, что у вас есть «половинный» массив, где каждый номер плитки хранится дважды подряд. Например, это может быть [1, 1, 2, 2] вместо [1, 2, 3, 4]. Я просто не знаю, как это реализовать. Вот часть моей программы:

// place checker on each bottom-row black space, and count paths 
for (int checkerPos = 1; checkerPos < rFringe; checkerPos += 2) 
{ // always starts in bottom-left-hand corner 
    board = resetBoard(board); // clear board for new checker 
    board[bottomRow][checkerPos] = 1; // put checker on starting location 
    // calculate # of paths from starting location to each end tile 
    for (int r = bottomRow - 1; r > 0; r--) // start in row above bottom, and end right before top fringe (i.e. row 0) 
    { 
     for (int c = 1; c < rFringe; c++) 
      board[r][c] = board[r + 1][c - 1] + board[r + 1][c + 1]; 
    } 

    // find end tile with max paths 
    max = board[1][1]; // default max is upper-left space on checkerboard 
    for (int c = 2; c < rFringe; c++) // don't re-check first column and don't check fringe 
    { 
     // compare this to other top-row boxes to find one with highest value 
     if (board[1][c] > max) 
     { 
      max = board[1][c]; 
      startLoc = checkerPos; // GETS WRONG VALUE 
      endLoc = c; // GETS WRONG VALUE 
     } 
    } 

    maxInfo[maxCount] = max; // add current piece's max to max array 
    maxInfo[maxCount + 1] = startLoc; // save start location 
    maxInfo[maxCount + 2] = endLoc; // save end location 
    maxCount += 3; // go to next empty slot in array 
} 

Как вы можете видеть, без пути к карте checkerPos и c к startLoc и endLoc, я не могу получить точные значения этих переменных.

ответ

1

Чтобы устранить эту проблему, я реализовал массив с «половиной».

int[] halved = new int[size]; // used for mapping the machine-readable tile #s to human-readable tile #s and letters 
// populate halved array 
for (int halvedIdx = 0, i = 1; halvedIdx < size - 1; halvedIdx += 2, i++) 
{ 
    halved[halvedIdx] = i; 
    halved[halvedIdx + 1] = i; 
} 

В дополнение к этому, я изменил

startLoc = checkerPos; 
endLoc = c; 

в

startLoc = halved[checkerPos]; 
endLoc = halved[c]; 

Я не уверен, если это лучшее решение. Если у кого есть предложения, не стесняйтесь комментировать.

UPDATE

Проблема с этим решением является то, что, если размер платы нечетный, checkerPos заканчивает тем, что за пределами границ половинного массива.

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