int func(int x, int y){
int xx=0, yy=0, a[4][3], d=0;
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 3; j++) {
a[i][j] = ++d;
a[3][j] = 0;
}
}
cout<<a[x][y]<<"["<<x<<"]"<<"["<<y<<"] "<<"-> ";
while(c<7) {
if(x==1 & y==1) { // если 5, то пропускаю
for (int i = x; i < 4; i++) {
for (int j = y; j < 3; j++) { continue; } }
}
else if(x==2 && y==0) { // если 7, то он не может в [3,2] - кнопка 12
if (x + t < 4 && y + o < 3) { c++; xx = x + t; yy = y + o; printf("(1)a[%d][%d] = %d [с = %d].\n ", xx, yy, a[xx][yy]=a[x + t][y + o]); func(xx,yy); }
if (x + t < 4 && y - o > -1) { c++; xx = x + t; yy = y - o; printf("(2)a[%d][%d] = %d [с = %d].\n ", xx, yy, a[xx][yy]=a[x + t][y - o]); func(xx,yy); }
// if (x + o < 4 && y + t < 3) { c++; xx = x + o; yy = y + t; printf("(3)a[%d][%d] = %d [с = %d].\n ", xx, yy, a[xx][yy]=a[x + o][y + t]); func(xx,yy}; }
if (x + o < 4 && y - t > -1) { c++; xx = x + o; yy = y - t; printf("(4)a[%d][%d] = %d [с = %d].\n ", xx, yy, a[xx][yy]=a[x + o][y -t]); func(xx,yy); }
if (x - t > -1 && y + o < 3) { c++; xx = x - t; yy = y + o; printf("(5)a[%d][%d] = %d [с = %d].\n ", xx, yy, a[xx][yy]=a[x - t][y + o]); func(xx,yy); }
if (x - o > -1 && y + t < 3) { c++; xx = x - o; yy = y + t; printf("(6)a[%d][%d] = %d [с = %d].\n ", xx, yy, a[xx][yy]=a[x - o][y + o]); func(xx,yy); }
if (x - t > -1 && y - o > -1) { c++; xx = x - t; yy = y - o; printf("(7)a[%d][%d] = %d [с = %d].\n ", xx, yy, a[xx][yy]=a[x - t][y - o]); func(xx,yy); }
if (x - o > -1 && y - t > -1) { c++; xx = x - o; yy = y - t; printf("(8)a[%d][%d] = %d [с = %d].\n ", xx, yy, a[xx][yy]=a[x - o][y - t]); func(xx,yy); }
}
else if(x==2 && y==2) { // если 9, то он не может в [3,0] - кнопка 10
if (x + t < 4 && y + o < 3) { c++; xx = x + t; yy = y + o; printf("(1)a[%d][%d] = %d [с = %d].\n ", xx, yy, a[xx][yy]=a[x + t][y + o]); func(xx,yy); }
if (x + t < 4 && y - o > -1) { c++; xx = x + t; yy = y - o; printf("(2)a[%d][%d] = %d [с = %d].\n ", xx, yy, a[xx][yy]=a[x + t][y - o]); func(xx,yy); }
if (x + o < 4 && y + t < 3) { c++; xx = x + o; yy = y + t; printf("(3)a[%d][%d] = %d [с = %d].\n ", xx, yy, a[xx][yy]=a[x + o][y + t]); func(xx,yy); }
// if (x + o < 4 && y - t > -1) { c++; xx = x + o; yy = y - t; printf("(4)a[%d][%d] = %d [с = %d].\n ", xx, yy, a[xx][yy]=a[x + o][y -t]); func(xx,yy};
if (x - t > -1 && y + o < 3) { c++; xx = x - t; yy = y + o; printf("(5)a[%d][%d] = %d [с = %d].\n ", xx, yy, a[xx][yy]=a[x - t][y + o]); func(xx,yy); }
if (x - o > -1 && y + t < 3) { c++; xx = x - o; yy = y + t; printf("(6)a[%d][%d] = %d [с = %d].\n ", xx, yy, a[xx][yy]=a[x - o][y + o]); func(xx,yy); }
if (x - t > -1 && y - o > -1) { c++; xx = x - t; yy = y - o; printf("(7)a[%d][%d] = %d [с = %d].\n ", xx, yy, a[xx][yy]=a[x - t][y - o]); func(xx,yy); }
if (x - o > -1 && y - t > -1) { c++; xx = x - o; yy = y - t; printf("(8)a[%d][%d] = %d [с = %d].\n ", xx, yy, a[xx][yy]=a[x - o][y - t]); func(xx,yy); }
} // тут перебор вариантов с увеличением счетчика ( c ), присваиваю к сторонним переменным true значения координат и опять запускаю функцию
if (x + t < 4 && y + o < 3) { c++; xx = x + t; yy = y + o; printf("(1)a[%d][%d] = %d [с = %d].\n ", xx, yy, a[xx][yy]=a[x + t][y + o], c); func(xx,yy); }
if (x + t < 4 && y - o > -1) { c++; xx = x + t; yy = y - o; printf("(2)a[%d][%d] = %d [с = %d].\n ", xx, yy, a[xx][yy]=a[x + t][y - o], c); func(xx,yy); }
if (x + o < 4 && y + t < 3) { c++; xx = x + o; yy = y + t; printf("(3)a[%d][%d] = %d [с = %d].\n ", xx, yy, a[xx][yy]=a[x + o][y + t], c); func(xx,yy); }
if (x + o < 4 && y - t > -1) { c++; xx = x + o; yy = y - t; printf("(4)a[%d][%d] = %d [с = %d].\n ", xx, yy, a[xx][yy]=a[x + o][y -t], c); func(xx,yy); }
if (x - t > -1 && y + o < 3) { c++; xx = x - t; yy = y + o; printf("(5)a[%d][%d] = %d [с = %d].\n ", xx, yy, a[xx][yy]=a[x - t][y + o], c); func(xx,yy); }
if (x - o > -1 && y + t < 3) { c++; xx = x - o; yy = y + t; printf("(6)a[%d][%d] = %d [с = %d].\n ", xx, yy, a[xx][yy]=a[x - o][y + o], c); func(xx,yy); }
if (x - t > -1 && y - o > -1) { c++; xx = x - t; yy = y - o; printf("(7)a[%d][%d] = %d [с = %d].\n ", xx, yy, a[xx][yy]=a[x - t][y - o], c); func(xx,yy); }
if (x - o > -1 && y - t > -1) { c++; xx = x - o; yy = y - t; printf("(8)a[%d][%d] = %d [с = %d].\n ", xx, yy, a[xx][yy]=a[x - o][y - t], c); func(xx,yy); }
}
return 0;
}
int main() {
func(0,0);
return 0;
}
1[0][0] -> (1)a[2][1] = 8 [с = 1].
8[2][1] -> (5)a[0][2] = 3 [с = 2].
3[0][2] -> (2)a[2][1] = 8 [с = 3].
8[2][1] -> (5)a[0][2] = 3 [с = 4].
3[0][2] -> (2)a[2][1] = 8 [с = 5].
8[2][1] -> (5)a[0][2] = 3 [с = 6].
3[0][2] -> (2)a[2][1] = 8 [с = 7].
8[2][1] -> (4)a[1][0] = 4 [с = 8].
4[1][0] -> (7)a[0][0] = 1 [с = 9].
1[0][0] -> (4)a[1][0] = 4 [с = 10].
4[1][0] -> (7)a[0][0] = 1 [с = 11].
1[0][0] -> (4)a[1][0] = 4 [с = 12].
4[1][0] -> (7)a[0][0] = 1 [с = 13].
1[0][0] -> (3)a[1][2] = 6 [с = 14].
6[1][2] ->
как дальше? он зациклился до 7, а потом перепрыгнул на 4, потом 1 и в конце с 1 на 6 - это правильно. Запутался Правила — f(b, 1) = 1, для остальных — sum{c=сосед(b)} f(c, i−1).
Можно и динамическим программированием, без рекурсии — всё равно расход вычислительной мощи незначительный. Сначала f(b, 2), затем f(b, 3), и т.д. до 7.
for (int i = 2; i <= 7; ++i) {
for (int b = 0; b <= 9; ++b) {
f[b][i] = 1; // 0.2 = 1?
}
}