Avoid if statements for checking neighboring indexes in a 2D array

Timon Gehr via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Sun Jul 16 10:40:18 PDT 2017


On 16.07.2017 19:10, Timon Gehr wrote:
> ...
> 
> (This works even if there are * at the border.)

Well, not really. :)

Version that actually works if there are * at the border:

import std.stdio, std.range, std.algorithm, std.array;
char[][] arr;
int componentSize(int row,int col){
     if(row>=arr.length||col>=arr[row].length||arr[row][col]!='*')
         return 0;
     arr[row][col]='x';
     return 1+cartesianProduct(iota(row-1,row+2),iota(col-1,col+2))
         .map!(a=>componentSize(a.expand)).sum;
}
void main (){
     arr=["**xxxx*",
          "xxxx*xx",
          "xx**xxx",
          "xxx*x**",
          "**xxxxx"].map!dup.array;
 
cartesianProduct(iota(cast(int)arr.length),iota(cast(int)arr[0].length))
         .filter!(a=>arr[a[0]][a[1]]=='*')
         .each!(a=>writeln(componentSize(a.expand)));
}


More information about the Digitalmars-d-learn mailing list