Идея довольно проста. По сути, вы должны идти, пока не дойдете до угла. Это конструкция do / while.
Мы начинаем в верхнем левом углу, поэтому наша начальная позиция - posx = 0 и posy = 0. На каждом шаге мы должны сдвигать одну (1) вправо и одну вниз (1), поэтому в направлении x мы имеем deltax = 1, а в направлении y deltay = 1 для каждого движения.
Если стена поражена, мы должны изменить направление.
Стена в направлении y поражается, если posy = 0 (вверху) или posy имеет размер 1 (нижний столбец), в этом случае дельта изменяет свой знак: deltay = -deltay.
То же самое для x: стена в направлении x удаляется, если posx = 0 (слева) или posx имеет размер-1 (крайний правый столбец), в этом случае deltax меняет свой знак: deltax = -deltax.
Для простоты я сделал sizex-1 и sizey-1 в самом начале (sizex--; sizey--;), поэтому тест просто проверяет размер.
Это должно прекратиться, когда мы попадаем в угол, то есть когда мы ударяемся о стены в направлении y и x.
Я добавил логическое значение, которое печатает отдельные шаги, если установлено значение 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
Вы не можете сделать драйверы устройств привилегированного режима в C#, поскольку время выполнения не может быть безопасно загружено в ring0 и работать как ожидалось.
Кроме того, C# не создает двоичные файлы, подходящие для загрузки как драйверы устройств, особенно относительно точек входа, которые должны представить драйверы. Зависимость от времени выполнения, чтобы вскочить и проанализировать и JIT, двоичный файл во время загрузки запрещает прямой доступ подсистема драйвера, должна загрузить двоичный файл.
существует работа в стадии реализации, однако, для подъема некоторых драйверов устройств в непривилегированный режим, Вы видите интервью здесь с Peter Wieland UDMF (Платформа Драйвера Непривилегированного режима) команда.
драйверы Непривилегированного режима намного больше подошли бы для управляемой работы, но необходимо будет погуглить немного, чтобы узнать, будут ли C# и.NET непосредственно поддерживаться. Все, что я знаю, - то, что драйверы уровня ядра не являются выполнимыми только в C#.
можно, однако, вероятно, сделать драйвер C/C++ и сервис C# (или подобный) и иметь драйвер, говорят с управляемым кодом, если абсолютно необходимо написать много кода в C#.
Это не прямой ответ на Ваш вопрос, но если Вам интересно, Вы могли бы посмотреть проект .
Особенностикто-либо может говорить с надежностью и безопасностью запущения программы C# ближе для Вызова 0, чем обычно имел бы место?
C# работает в Виртуальной машине.NET, Вы не можете переместить его немного ближе для Вызова 0, чем VM, и выполнения VM в пространстве пользователя.
Запись драйверов устройств в .NET не имеет никакого смысла для текущих версий окон.
< speculation>
Слухи - то, что MS инвестирует много денег в обеспечении Особенности к следующему уровню. Просто ищите Midori. Но это - 2015 +
</speculation>
Microsoft имеет много исследовательских проектов в области наличия управляемого кода ОС, другими словами, уничтожьте с API Win32.
См. статью Mary Jo Foley: Восстановление Наследия
Если вы хотите попробовать проприетарный фреймворк, инструментарий Jungo WinDriver поддерживает разработку драйверов пользовательского режима (даже в управляемом коде) для USB, PCI, и устройства PCI-E.