Значит, алгоритм может быть рабочий. Но тогда как проверять сохранение связности? Не могу понять, каким образом эту задачу решает функция 
checkConsistency. Вот все функции, упомянутые TheFire & theShockwave, на C#. 
checkConsistencyКод:
      private bool checkConsistency(int [,] m){
         int [,] tmp=new int[3,3];
         int bi=-1,bj=-1;
         for(int i=0;i<3;i++){
            for(int j=0;j<3;j++){
               if((tmp[i,j]=m[i,j])==1 && (i!=1||j!=1) ){bi=i;bj=j;}
            }
         }
         tmp[1,1]=0;
         if(bi!=-1){
            Queue q=new Queue(16);
            q.Enqueue(bi);
            q.Enqueue(bj);
            int i,j;
            while(q.Count!=0) {
               i=System.Convert.ToInt32(q.Dequeue));
               j=System.Convert.ToInt32(q.Dequeue));
            
               tmp[i,j]=0;
               if((i!=0)&&(j!=0)&&(tmp[i-1,j-1]==1)) {
                  q.Enqueue(i-1);q.Enqueue(j-1);
               }
               if(i!=0&&tmp[i-1,j]==1) {
                  q.Enqueue(i-1);q.Enqueue(j);
               }
               if(i!=0&&j!=2&&tmp[i-1,j+1]==1) {
                  q.Enqueue(i-1);q.Enqueue(j+1);
               }
               if(j!=0&&tmp[i,j-1]==1) {
                  q.Enqueue(i);q.Enqueue(j-1);
               }
               if(j!=2&&tmp[i,j+1]==1) {
                  q.Enqueue(i);q.Enqueue(j+1);
               }
               if(i!=2&&j!=0&&tmp[i+1,j-1]==1) {
                  q.Enqueue(i+1);q.Enqueue(j-1);
               }
               if(i!=2&&tmp[i+1,j]==1) {
                  q.Enqueue(i+1);q.Enqueue(j);
               }
               if(i!=2&&j!=2&&tmp[i+1,j+1]==1) {
                  q.Enqueue(i+1);q.Enqueue(j+1);
               }            
            }
            bi=-1;bj=-1;
            for(i=0;i<3;i++){
               for(j=0;j<3;j++){
                  if(tmp[i,j]==1 && (i!=1||j!=1) ){bi=i;bj=j;}
               }
            }
            if(bi!=-1) return false;
            else return true;
         }else{
            return true;
         }
      }
skeletonLetterКод:
      private void skeletonLetter(ref Bitmap bmp){
         int i=1,j=1,width=bmp.Width,height=bmp.Height;
         int [,]bitmap=new int[width+2,height+2];
         
         for(i=2;i<width;i++){
            for(j=2;j<height;j++){
               if(bmp.GetPixel(i-1,j-1).GetBrightness()==0) bitmap[i,j]=1;
               else bitmap[i,j]=0;
            }
         }               
         int [,]okr=new int[3,3];
         int []okrs=new int[10];
         bool flag=true;
         while(flag){
            flag=false;
            for(i=1;i<=width;i++){
               for(j=1;j<=height;j++){
                  if(bitmap[i,j]==1){
                     okr[0,0]=okrs[0]=bitmap[i-1,j-1];
                     okr[1,0]=okrs[1]=bitmap[i,j-1];
                     okr[2,0]=okrs[2]=bitmap[i+1,j-1];
                     okr[2,1]=okrs[3]=bitmap[i+1,j];
                     okr[2,2]=okrs[4]=bitmap[i+1,j+1];
                     okr[1,2]=okrs[5]=bitmap[i,j+1];
                     okr[0,2]=okrs[6]=bitmap[i-1,j+1];
                     okr[0,1]=okrs[7]=bitmap[i-1,j];
                     okrs[8]=okrs[0];
                     okrs[9]=okrs[1];
                     if(pointB(ref okrs)>1 && point03(okrs) && checkConsistency(okr)){
                        bitmap[i,j]=2;
                        //MessageBox.Show(i.ToString()+" "+j.ToString());
                     }
                  }
               }
            }
            for(i=1;i<=width;i++){
               for(j=1;j<=height;j++){
                  if(bitmap[i,j]==2){
                     bitmap[i,j]=0;
                     flag=true;
                  }
               }
            }
         
         }
      
         for(i=1;i<=width-1;i++) {
            for(j=1;j<=height-1;j++) {
               if(bitmap[i,j]==1) bmp.SetPixel(i-1,j-1,Color.Black);
               else bmp.SetPixel(i-1,j-1,Color.White);
            }
         }
      }
point03Код:
         
      private bool point03(int []m){
         for(int i=0;i<8;i++){
            if(m[i]==0 && m[i+1]==0 && m[i+2]==0){
               return true;
            }
         }
         return false;
      }
pointBКод:
         
      private int pointB(ref int [] m) {
         int sum=0;
         for(int i=0;i<8;i++){
            if(m[i]!=0) sum++;
         }
         return sum;
      }