Идея довольно проста.По сути, вы должны идти, пока не дойдете до угла.Это конструкция do / while.
Мы начинаем в верхнем левом углу, поэтому наша начальная позиция - posx = 0 и posy = 0.На каждом шаге мы должны двигаться на одну (1) вправо и одну вниз (1), поэтому в направлении x мы имеем deltax = 1, а в направлении y deltay = 1 для каждого движения.
Если aударили о стену, мы должны изменить направление.
ударили о стену в направлении y, если posy = 0 (вверху) или posy имеет размер 1 (нижний столбец), в этом случае дельтай изменяет свой знак: deltay = -deltay.
То же самое для x: стена в направлении x удаляется, если posx = 0 (слева) или posx имеет размер-1 (крайний правый столбец), в этом случае deltax меняет свой знак: deltax = -deltax.
Для простоты я сделал sizex-1 и sizey-1 в самом начале (sizex--; sizey--;), поэтому тест просто проверяет размер.
Это должно прекратитьсякогда мы попадаем в угол, это когда мы ударяем стены в направлении у и х.
Я добавил логическое значение, которое печатает отдельные шаги, если установлено значение true.
[Может быть, вы хотите добавить дополнительную проверку для недопустимых прямоугольников, таких как diagonalWalk (-1, -1)] *
public static int diagonalWalk(int sizex, int sizey, boolean showSteps) {
int posx = 0;
int posy = 0;
int sum = 1;
int deltay = 1;
int deltax = 1;
sizex--;//valid cols are: 0 - sizex-1
sizey--;//valid rows are: 0 - sizey-1
if (showSteps) {
System.out.println("At: 0/0:1");
}
do {
posx += deltax;
posy += deltay;
sum += Math.pow(2, posx) * Math.pow(2, posy);
if (showSteps) {
System.out.println("At: " + posy + "/" + posx + ":" + Math.pow(2, posx) * Math.pow(2, posy));
}
//wallhit left or right
if (posx == 0 || posx >= sizex) {
deltax = -deltax;
}
//wallhit top or bottom
if (posy == 0 || posy >= sizey) {
deltay = -deltay;
}
}while(!((posx == 0 || posx >= sizex) && (posy == 0 || posy >= sizey)));
return sum;
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
int sum = diagonalWalk(3,4, true);
System.out.println("result is:" + sum);
}
пример выполнения:
At: 0/0:1
At: 1/1:4.0
At: 2/2:16.0
At: 3/1:16.0
At: 2/0:4.0
At: 1/1:4.0
At: 0/2:4.0
result is:49