Algorithme de fenêtre glissante en C #

J’essaie d’implémenter un simple algorithme de fenêtre glissante sur un tableau à deux dimensions en C # 3.0. Je trouve cela très utile, mais il ne s’agit que d’un tableau à une dimension.

Le message inclut également le code de l’algo, je ne l’utilise absolument pas pour mon senario … quelqu’un peut-il me suggérer comment procéder?

Scénario:

http://soffr.miximages.com/algorithm/masortingx.jpg http://soffr.miximages.com/algorithm/masortingx.jpg

L’image ci-dessus est une masortingce 10X10 et doit être extraite de la masortingce 3X3, en utilisant n’importe quel algorithme (une fenêtre glissante serait très utile). Le rectangle rouge est un premier ensemble et le vert est le second. et il continue jusqu’à la fin pour toutes les lignes

PS: J’ai googlé à propos de l’algo, mais pas de chance 🙁

Mise en œuvre naïve:

private static IEnumerable GetWindows( T[,] array, int windowWidth, int windowHeight) { for (var y = 0; y < array.GetLength(1) - windowHeight + 1; y++) { for (var x = 0; x < array.GetLength(0) - windowWidth + 1; x++) { var slice = new T[windowWidth, windowHeight]; CopyArray(array, x, y, slice, 0, 0, windowWidth, windowHeight); yield return slice; } } } 

Méthode d'assistance pour copier entre des tableaux à deux dimensions:

 private static void CopyArray( T[,] src, int srcX, int srcY, T[,] dst, int dstX, int dstY, int width, int height) { for (var x = 0; x < width; x++) { for (var y = 0; y < height; y++) { dst[dstX + x, dstY + y] = src[srcX + x, srcY + y]; } } } 

Test principal:

 private static void Main(ssortingng[] args) { var array = new ssortingng[5, 5]; for (var y = 0; y < array.GetLength(1); y++) { for (var x = 0; x < array.GetLength(0); x++) { array[x, y] = string.Format("({0}|{1})", x, y); } } foreach (var window in GetWindows(array, 3, 3)) { ShowArray(window); } Console.ReadLine(); } private static void ShowArray(T[,] array) { for (var x = 0; x < array.GetLength(0); x++) { for (var y = 0; y < array.GetLength(1); y++) { Console.Write(" {0}", array[x, y]); } Console.WriteLine(); } Console.WriteLine(); } 

Sortie:

 (0|0) (0|1) (0|2) (1|0) (1|1) (1|2) (2|0) (2|1) (2|2) (1|0) (1|1) (1|2) (2|0) (2|1) (2|2) (3|0) (3|1) (3|2) (2|0) (2|1) (2|2) (3|0) (3|1) (3|2) (4|0) (4|1) (4|2) (0|1) (0|2) (0|3) (1|1) (1|2) (1|3) (2|1) (2|2) (2|3) (1|1) (1|2) (1|3) (2|1) (2|2) (2|3) (3|1) (3|2) (3|3) (2|1) (2|2) (2|3) (3|1) (3|2) (3|3) (4|1) (4|2) (4|3) (0|2) (0|3) (0|4) (1|2) (1|3) (1|4) (2|2) (2|3) (2|4) (1|2) (1|3) (1|4) (2|2) (2|3) (2|4) (3|2) (3|3) (3|4) (2|2) (2|3) (2|4) (3|2) (3|3) (3|4) (4|2) (4|3) (4|4) 

Il ne vous rest plus qu'à appliquer la même technique que celle décrite dans ce billet de blog 🙂