int testCells[11][11];
for (i=1; i<10; i++) {
testCells[i][0]=92;
testCells[0][i]=92;
testCells[i][10]=92;
testCells[10][i]=92;
}
- (void) makeWaysFromI:(int) ii AndJ:(int) jj {
int i,j;
for (i=0;i<9;i++) {
for (j=0; j<9; j++) {
if (cells[i][j]) {
testCells[i+1][j+1]=92;
} else {
testCells[i+1][j+1]=93;
}
}
}
testCells[ii+1][jj+1]=0;
BOOL flag;
int k=0;
do {
flag=FALSE;
for (i=1; i<10; i++) {
for (j=1; j<10; j++) {
if ((testCells[i][j]==93)&&((testCells[i][j+1]==k)||(testCells[i+1][j]==k)||(testCells[i][j-1]==k)||(testCells[i-1][j]==k))) {
flag=TRUE;
testCells[i][j]=k+1;
}
}
}
if (flag) {
k=k+1;
}
} while (flag);
}
Мы завели вспомогательный массив testCells[11][11], который будет содержать информацию о том, в какую клетку попасть можно, а в какую нельзя, и если можно, то за сколько шагов. Мы ее сделали больше и "оградили" по краям, для того чтоб избежать проверку на выход за границы массива.
Мы использовали числа 92 если клетка уже занята и 93 если свободна.
ii и jj это координаты фигуры которую собираются передвинуть.
Ей присваивается 0, далее в цикле проверяются ячейки, в которых выполняется условие: в ячейке 93 и по соседству (справа или снизу или слева или сверху) "фишка" на единцу меньшая, если мы не нашли ни одной ячейки, удовлетворяющей условию, то цикл прекращается.
Мы получим массив, в котором, если 92, то там находится фигура, если 93 то там свободная клетка в которую хода нет, если 0 то это та фигура, которую мы собираемся двигать, если от 1 до 91 то пустая клетка в которую можно переместиться за данное число ходов.
Сообщение отредактировал fibe: 05.08.2013, 14:48:57