Generated on Thu Mar 22 10:39:31 2012 for Gecode by doxygen 1.6.3

sudoku.cpp

Go to the documentation of this file.
00001 /* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */
00002 /*
00003  *  Main authors:
00004  *     Mikael Lagerkvist <lagerkvist@gecode.org>
00005  *     Guido Tack <tack@gecode.org>
00006  *     Christian Schulte <schulte@gecode.org>
00007  *
00008  *  Copyright:
00009  *     Mikael Lagerkvist, 2005
00010  *     Guido Tack, 2005
00011  *     Christian Schulte, 2005
00012  *
00013  *  Last modified:
00014  *     $Date: 2010-10-07 11:52:01 +0200 (Thu, 07 Oct 2010) $ by $Author: schulte $
00015  *     $Revision: 11473 $
00016  *
00017  *  This file is part of Gecode, the generic constraint
00018  *  development environment:
00019  *     http://www.gecode.org
00020  *
00021  *  Permission is hereby granted, free of charge, to any person obtaining
00022  *  a copy of this software and associated documentation files (the
00023  *  "Software"), to deal in the Software without restriction, including
00024  *  without limitation the rights to use, copy, modify, merge, publish,
00025  *  distribute, sublicense, and/or sell copies of the Software, and to
00026  *  permit persons to whom the Software is furnished to do so, subject to
00027  *  the following conditions:
00028  *
00029  *  The above copyright notice and this permission notice shall be
00030  *  included in all copies or substantial portions of the Software.
00031  *
00032  *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
00033  *  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
00034  *  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
00035  *  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
00036  *  LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
00037  *  OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
00038  *  WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
00039  *
00040  */
00041 
00042 #include <gecode/driver.hh>
00043 #include <gecode/int.hh>
00044 #include <gecode/minimodel.hh>
00045 
00046 #ifdef GECODE_HAS_SET_VARS
00047 #include <gecode/set.hh>
00048 #endif
00049 
00050 #include <string>
00051 #include <cmath>
00052 #include <cctype>
00053 
00054 using namespace Gecode;
00055 
00056 namespace {
00057   extern const char* examples[];
00058   extern const unsigned int n_examples;
00059   int example_size(const char *s);
00060   int sudokuField(const char *s, int n, int i, int j);
00061 }
00062 
00064 class Sudoku : public Script {
00065 protected:
00067   const int n;
00068 public:
00069 #ifdef GECODE_HAS_SET_VARS
00070 
00071   enum {
00072     MODEL_INT,   
00073     MODEL_SET,   
00074     MODEL_MIXED  
00075   };
00076 #endif
00077   // Branching variants
00078   enum {
00079     BRANCH_NONE,        
00080     BRANCH_SIZE,        
00081     BRANCH_SIZE_DEGREE, 
00082     BRANCH_SIZE_AFC,    
00083     BRANCH_AFC          
00084   };
00085 
00087   Sudoku(const SizeOptions& opt) : n(example_size(examples[opt.size()])) {}
00088 
00090   Sudoku(bool share, Sudoku& s) : Script(share,s), n(s.n) {}
00091 
00092 };
00093 
00099 class SudokuInt : virtual public Sudoku {
00100 protected:
00102   IntVarArray x;
00103 public:
00104 #ifdef GECODE_HAS_SET_VARS
00105 
00106   enum {
00107     PROP_NONE, 
00108     PROP_SAME, 
00109   };
00110 #endif
00111 
00112   SudokuInt(const SizeOptions& opt)
00113     : Sudoku(opt), x(*this, n*n*n*n, 1, n*n) {
00114     const int nn = n*n;
00115     Matrix<IntVarArray> m(x, nn, nn);
00116 
00117     // Constraints for rows and columns
00118     for (int i=0; i<nn; i++) {
00119       distinct(*this, m.row(i), opt.icl());
00120       distinct(*this, m.col(i), opt.icl());
00121     }
00122 
00123     // Constraints for squares
00124     for (int i=0; i<nn; i+=n) {
00125       for (int j=0; j<nn; j+=n) {
00126         distinct(*this, m.slice(i, i+n, j, j+n), opt.icl());
00127       }
00128     }
00129 
00130     // Fill-in predefined fields
00131     for (int i=0; i<nn; i++)
00132       for (int j=0; j<nn; j++)
00133         if (int v = sudokuField(examples[opt.size()], nn, i, j))
00134           rel(*this, m(i,j), IRT_EQ, v );
00135 
00136 #ifdef GECODE_HAS_SET_VARS
00137     if (opt.propagation() == PROP_SAME) {
00138       // Implied constraints linking squares and rows
00139       for (int b=0; b<n; b++) {
00140         int b1c = 0;
00141         int b2c = 0;
00142         IntVarArgs bc1(nn-n);
00143         IntVarArgs bc2(nn-n);
00144         IntVarArgs br1(nn-n);
00145         IntVarArgs br2(nn-n);
00146         for (int i=0; i<n; i++)
00147           for (int j=0; j<n; j++) {
00148             b1c = 0; b2c = 0;
00149             for (int k=0; k<n; k++) {
00150               if (k != j) {
00151                 IntVarArgs bc1s = block_col(m, b, i, k);
00152                 IntVarArgs br1s = block_row(m, b, i, k);
00153                 for (int count=0; count<n; count++) {
00154                   bc1[b1c] = bc1s[count];
00155                   br1[b1c] = br1s[count];
00156                   ++b1c;
00157                 }
00158               }
00159               if (k != i) {
00160                 IntVarArgs bc2s = block_col(m, b, k, j);
00161                 IntVarArgs br2s = block_row(m, b, k, j);
00162                 for (int count=0; count<n; count++) {
00163                   bc2[b2c] = bc2s[count];
00164                   br2[b2c] = br2s[count];
00165                   ++b2c;
00166                 }
00167               }
00168             }
00169             same(*this, nn, bc1, bc2);
00170             same(*this, nn, br1, br2);
00171           }
00172       }
00173     }
00174 #endif
00175     if (opt.branching() == BRANCH_NONE) {
00176       branch(*this, x, INT_VAR_NONE, INT_VAL_SPLIT_MIN);
00177     } else if (opt.branching() == BRANCH_SIZE) {
00178       branch(*this, x, INT_VAR_SIZE_MIN, INT_VAL_SPLIT_MIN);
00179     } else if (opt.branching() == BRANCH_SIZE_DEGREE) {
00180       branch(*this, x, INT_VAR_SIZE_DEGREE_MIN, INT_VAL_SPLIT_MIN);
00181     } else if (opt.branching() == BRANCH_SIZE_AFC) {
00182       branch(*this, x, INT_VAR_SIZE_AFC_MIN, INT_VAL_SPLIT_MIN);
00183     } else if (opt.branching() == BRANCH_AFC) {
00184       branch(*this, x, INT_VAR_AFC_MAX, INT_VAL_SPLIT_MIN);
00185     }
00186   }
00187 
00189   SudokuInt(bool share, SudokuInt& s) : Sudoku(share, s) {
00190     x.update(*this, share, s.x);
00191   }
00192 
00194   virtual Space*
00195   copy(bool share) {
00196     return new SudokuInt(share,*this);
00197   }
00198 
00200   virtual void
00201   print(std::ostream& os) const {
00202     os << "  ";
00203     for (int i = 0; i<n*n*n*n; i++) {
00204       if (x[i].assigned()) {
00205         if (x[i].val()<10)
00206           os << x[i] << " ";
00207         else
00208           os << (char)(x[i].val()+'A'-10) << " ";
00209       }
00210       else
00211         os << ". ";
00212       if((i+1)%(n*n) == 0)
00213         os << std::endl << "  ";
00214     }
00215     os << std::endl;
00216   }
00217 
00218 #ifdef GECODE_HAS_SET_VARS
00219 private:
00221   void same(Space& home, int nn, IntVarArgs a, IntVarArgs b) {
00222     SetVar u(home, IntSet::empty, 1, nn);
00223     rel(home, SOT_DUNION, a, u);
00224     rel(home, SOT_DUNION, b, u);
00225   }
00226 
00228   IntVarArgs
00229   block_col(Matrix<IntVarArray> m, int bc, int i, int j) {
00230     return m.slice(bc*n+i, bc*n+i+1, j*n, (j+1)*n);
00231   }
00232 
00234   IntVarArgs
00235   block_row(Matrix<IntVarArray> m, int br, int i, int j) {
00236     return m.slice(j*n, (j+1)*n, br*n+i, br*n+i+1);
00237   }
00238 #endif
00239 };
00240 
00241 #ifdef GECODE_HAS_SET_VARS
00242 
00247 class SudokuSet : virtual public Sudoku {
00248 protected:
00250   SetVarArray y;
00251 public:
00253   SudokuSet(const SizeOptions& opt)
00254     : Sudoku(opt),
00255       y(*this,n*n,IntSet::empty,1,n*n*n*n,n*n,n*n) {
00256 
00257     const int nn = n*n;
00258 
00259     Region r(*this);
00260     IntSet* row = r.alloc<IntSet>(nn);
00261     IntSet* col = r.alloc<IntSet>(nn);
00262     IntSet* block = r.alloc<IntSet>(nn);
00263 
00264     // Set up the row and column set constants
00265     int* dsc = r.alloc<int>(nn);
00266     for (int i=0; i<nn; i++) {
00267       row[i] = IntSet((i*nn)+1, (i+1)*nn);
00268 
00269       for (int j=0; j<nn; j++) {
00270         dsc[j] = (j*nn)+1+i;
00271       }
00272       col[i] = IntSet(dsc, nn);
00273     }
00274 
00275     // Set up the block set constants
00276     int* dsb_arr = r.alloc<int>(nn);
00277     for (int i=0; i<n; i++) {
00278       for (int j=0; j<n; j++) {
00279 
00280         for (int ii=0; ii<n; ii++) {
00281           for (int jj=0; jj<n; jj++) {
00282             dsb_arr[ii*n+jj] = j*nn*n+i*n+jj*nn+ii+1;
00283           }
00284         }
00285         block[i*n+j] = IntSet(dsb_arr, nn);
00286       }
00287     }
00288 
00289     IntSet full(1, nn*nn);
00290     // All x must be pairwise disjoint and partition the field indices
00291     rel(*this, SOT_DUNION, y, SetVar(*this, full, full));
00292 
00293     // The x must intersect in exactly one element with each
00294     // row, column, and block
00295     for (int i=0; i<nn; i++)
00296       for (int j=0; j<nn; j++) {
00297         SetVar inter_row(*this, IntSet::empty, full, 1, 1);
00298         rel(*this, y[i], SOT_INTER, row[j], SRT_EQ, inter_row);
00299         SetVar inter_col(*this, IntSet::empty, full, 1, 1);
00300         rel(*this, y[i], SOT_INTER, col[j], SRT_EQ, inter_col);
00301         SetVar inter_block(*this, IntSet::empty, full, 1, 1);
00302         rel(*this, y[i], SOT_INTER, block[j], SRT_EQ, inter_block);
00303       }
00304 
00305     // Fill-in predefined fields
00306     for (int i=0; i<nn; i++)
00307       for (int j=0; j<nn; j++)
00308         if (int idx = sudokuField(examples[opt.size()], nn, i, j))
00309           dom(*this, y[idx-1], SRT_SUP, (i+1)+(j*nn) );
00310 
00311     if (opt.branching() == BRANCH_NONE) {
00312       branch(*this, y, SET_VAR_NONE, SET_VAL_MIN_INC);
00313     } else if (opt.branching() == BRANCH_SIZE) {
00314       branch(*this, y, SET_VAR_SIZE_MIN, SET_VAL_MIN_INC);
00315     } else if (opt.branching() == BRANCH_SIZE_DEGREE) {
00316       branch(*this, y, SET_VAR_SIZE_DEGREE_MIN, SET_VAL_MIN_INC);
00317     } else if (opt.branching() == BRANCH_SIZE_AFC) {
00318       branch(*this, y, SET_VAR_SIZE_AFC_MIN, SET_VAL_MIN_INC);
00319     } else if (opt.branching() == BRANCH_AFC) {
00320       branch(*this, y, SET_VAR_AFC_MAX, SET_VAL_MIN_INC);
00321     }
00322   }
00323 
00325   SudokuSet(bool share, SudokuSet& s) : Sudoku(share,s) {
00326     y.update(*this, share, s.y);
00327   }
00328 
00330   virtual Space*
00331   copy(bool share) {
00332     return new SudokuSet(share,*this);
00333   }
00334 
00336   virtual void
00337   print(std::ostream& os) const {
00338     os << '\t';
00339     for (int i = 0; i<n*n*n*n; i++) {
00340       for (int j=0; j<n*n; j++) {
00341         if (y[j].contains(i+1)) {
00342           if (j+1<10)
00343             os << j+1 << " ";
00344           else
00345             os << (char)(j+1+'A'-10) << " ";
00346           break;
00347         }
00348       }
00349       if((i+1)%(n*n) == 0)
00350         os << std::endl << '\t';
00351     }
00352     os << std::endl;
00353   }
00354 };
00355 
00356 
00363 class SudokuMixed : public SudokuInt, public SudokuSet {
00364 public:
00366   SudokuMixed(const SizeOptions& opt)
00367   : Sudoku(opt), SudokuInt(opt), SudokuSet(opt) {
00368     const int nn = n*n;
00369 
00370     IntSet is0(0,0);
00371     SetVar dummySet0(*this, is0, is0);
00372     IntVar dummyInt0(*this, 0, 0);
00373     SetVarArgs ys(nn+1);
00374     ys[0] = dummySet0;
00375     for (int i=0; i<nn; i++)
00376       ys[i+1] = y[i];
00377     IntVarArgs xs(nn*nn+1);
00378     xs[0] = dummyInt0;
00379     for (int i=0; i<nn*nn; i++)
00380       xs[i+1] = x[i];
00381 
00382     channel(*this, xs, ys);
00383 
00384     IntArgs values(nn);
00385     for (int i=nn; i--;)
00386       values[i] = i+1;
00387     count(*this, x, IntSet(nn,nn), values, ICL_DOM);
00388   }
00389 
00391   SudokuMixed(bool share, SudokuMixed& s)
00392   : Sudoku(share, s), SudokuInt(share, s), SudokuSet(share, s) {}
00393 
00395   virtual Space*
00396   copy(bool share) {
00397     return new SudokuMixed(share,*this);
00398   }
00399 
00401   virtual void print(std::ostream& os) const { SudokuInt::print(os); }
00402 
00403 };
00404 
00405 #endif
00406 
00410 int
00411 main(int argc, char* argv[]) {
00412   SizeOptions opt("Sudoku");
00413   opt.size(0);
00414   opt.icl(ICL_DOM);
00415   opt.solutions(1);
00416 #ifdef GECODE_HAS_SET_VARS
00417   opt.model(Sudoku::MODEL_INT);
00418   opt.model(Sudoku::MODEL_INT, "int", "use integer constraints");
00419   opt.model(Sudoku::MODEL_SET, "set", "use set constraints");
00420   opt.model(Sudoku::MODEL_MIXED, "mixed",
00421             "use both integer and set constraints");
00422   opt.propagation(SudokuInt::PROP_NONE);
00423   opt.propagation(SudokuInt::PROP_NONE, "none", "no additional constraints");
00424   opt.propagation(SudokuInt::PROP_SAME, "same",
00425                   "additional \"same\" constraint for integer model");
00426 #endif
00427   opt.branching(Sudoku::BRANCH_SIZE_AFC);
00428   opt.branching(Sudoku::BRANCH_NONE, "none", "none");
00429   opt.branching(Sudoku::BRANCH_SIZE, "size", "min size");
00430   opt.branching(Sudoku::BRANCH_SIZE_DEGREE, "sizedeg", "min size over degree");
00431   opt.branching(Sudoku::BRANCH_SIZE_AFC, "sizeafc", "min size over afc");
00432   opt.branching(Sudoku::BRANCH_AFC, "afc", "maximum afc");
00433   opt.parse(argc,argv);
00434   if (opt.size() >= n_examples) {
00435     std::cerr << "Error: size must be between 0 and "
00436               << n_examples-1 << std::endl;
00437     return 1;
00438   }
00439 #ifdef GECODE_HAS_SET_VARS
00440   switch (opt.model()) {
00441   case Sudoku::MODEL_INT:
00442     Script::run<SudokuInt,DFS,SizeOptions>(opt);
00443     break;
00444   case Sudoku::MODEL_SET:
00445     Script::run<SudokuSet,DFS,SizeOptions>(opt);
00446     break;
00447   case Sudoku::MODEL_MIXED:
00448     Script::run<SudokuMixed,DFS,SizeOptions>(opt);
00449     break;
00450   }
00451 #else
00452   Script::run<SudokuInt,DFS,SizeOptions>(opt);
00453 #endif
00454   return 0;
00455 }
00456 
00457 namespace {
00458 
00467 
00469   const char* examples[] = {
00470     // 0
00471     "...2.5..."
00472     ".9....73."
00473     "..2..9.6."
00474     "2.....4.9"
00475     "....7...."
00476     "6.9.....1"
00477     ".8.4..1.."
00478     ".63....8."
00479     "...6.8..."
00480     ,
00481     // 1
00482     "3..9.4..1"
00483     "..2...4.."
00484     ".61...79."
00485     "6..247..5"
00486     "........."
00487     "2..836..4"
00488     ".46...23."
00489     "..9...6.."
00490     "5..3.9..8"
00491     ,
00492     // 2
00493     "....1...."
00494     "3.14..86."
00495     "9..5..2.."
00496     "7..16...."
00497     ".2.8.5.1."
00498     "....97..4"
00499     "..3..4..6"
00500     ".48..69.7"
00501     "....8...."
00502     ,
00503     // 3
00504     // Fiendish puzzle April 21 2005 Times London
00505     "..4..3.7."
00506     ".8..7...."
00507     ".7...82.5"
00508     "4.....31."
00509     "9.......8"
00510     ".15.....4"
00511     "1.69...3."
00512     "....2..6."
00513     ".2.4..5.."
00514     ,
00515     // 4
00516     // This one requires search
00517     ".43.8.25."
00518     "6........"
00519     ".....1.94"
00520     "9....4.7."
00521     "...6.8..."
00522     ".1.2....3"
00523     "82.5....."
00524     "........5"
00525     ".34.9.71."
00526     ,
00527     // 5
00528     // Hard one from http://www.cs.mu.oz.au/671/proj3/node5.html
00529     ".....3.6."
00530     ".......1."
00531     ".975...8."
00532 
00533     "....9.2.."
00534     "..8.7.4.."
00535     "..3.6...."
00536 
00537     ".1...289."
00538     ".4......."
00539     ".5.1....."
00540     , // Puzzle 1 from http://www.sudoku.org.uk/bifurcation.htm
00541     // 6
00542     "1..9.7..3"
00543     ".8.....7."
00544     "..9...6.."
00545     "..72.94.."
00546     "41.....95"
00547     "..85.43.."
00548     "..3...7.."
00549     ".5.....4."
00550     "2..8.6..9"
00551     , // Puzzle 2 from http://www.sudoku.org.uk/bifurcation.htm
00552     // 7
00553     "...3.2..."
00554     ".5.798.3."
00555     "..7...8.."
00556     "..86.73.."
00557     ".7.....6."
00558     "..35.41.."
00559     "..5...6.."
00560     ".2.419.5."
00561     "...8.6..."
00562     , // Puzzle 3 from http://www.sudoku.org.uk/bifurcation.htm
00563     // 8
00564     "...8....6"
00565     "..162.43."
00566     "4...71..2"
00567     "..72...8."
00568     "....1...."
00569     ".1...62.."
00570     "1..73...4"
00571     ".26.481.."
00572     "3....5..."
00573     , // Puzzle 4 from http://www.sudoku.org.uk/bifurcation.htm
00574     // 9
00575     "3.5..4.7."
00576     ".7......1"
00577     ".4.9...3."
00578     "4...51..6"
00579     ".9.....4."
00580     "2..84...7"
00581     ".2...7.6."
00582     "8......9."
00583     ".6.4..2.8"
00584     , // Puzzle 5 from http://www.sudoku.org.uk/bifurcation.htm
00585     // 10
00586     "...7..3.."
00587     ".6....57."
00588     ".738..41."
00589     "..928...."
00590     "5.......9"
00591     "....936.."
00592     ".98..715."
00593     ".54....6."
00594     "..1..9..."
00595     , // Puzzle 6 from http://www.sudoku.org.uk/bifurcation.htm
00596     // 11
00597     "...6....4"
00598     ".3..9..2."
00599     ".6.8..7.."
00600     "..5.6...1"
00601     "67.3.1.58"
00602     "9...5.4.."
00603     "..6..3.9."
00604     ".1..8..6."
00605     "2....6..."
00606     , // Puzzle 7 from http://www.sudoku.org.uk/bifurcation.htm
00607     // 12
00608     "8....1.4."
00609     "2.6.9..1."
00610     "..9..6.8."
00611     "124.....9"
00612     "........."
00613     "9.....824"
00614     ".5.4..1.."
00615     ".8..7.2.5"
00616     ".9.5....7"
00617     , // Puzzle 8 from http://www.sudoku.org.uk/bifurcation.htm
00618     // 13
00619     "652.48..7"
00620     ".7.2.54.."
00621     "........."
00622     ".641...7."
00623     "....8...."
00624     ".8...456."
00625     "........."
00626     "..86.7.2."
00627     "2..89.751"
00628     , // Puzzle 9 from http://www.sudoku.org.uk/bifurcation.htm
00629     // 14
00630     "..6..2..9"
00631     "1..5...2."
00632     ".473.6..1"
00633     ".....8.4."
00634     ".3.....7."
00635     ".1.6....."
00636     "4..8.321."
00637     ".6...1..4"
00638     "3..4..9.."
00639     , // Puzzle 10 from http://www.sudoku.org.uk/bifurcation.htm
00640     // 15
00641     "..4.5.9.."
00642     "....7...6"
00643     "37......2"
00644     "..95...8."
00645     "..12.43.."
00646     ".6...92.."
00647     "2......93"
00648     "1...4...."
00649     "..6.2.7.."
00650     , // Puzzle 11 from http://www.sudoku.org.uk/bifurcation.htm
00651     // 16
00652     "....3.79."
00653     "3.......5"
00654     "...4.73.6"
00655     ".53.94.7."
00656     "....7...."
00657     ".1.82.64."
00658     "7.19.8..."
00659     "8.......1"
00660     ".94.1...."
00661     , // From http://www.sudoku.org.uk/discus/messages/29/51.html?1131034031
00662     // 17
00663     "2581.4.37"
00664     "936827514"
00665     "47153.28."
00666     "7152.3.4."
00667     "849675321"
00668     "36241..75"
00669     "1249..753"
00670     "593742168"
00671     "687351492"
00672     ,
00673     // 18
00674     // The following minimal 25*25 Sudokus are from Alain Frisch
00675     // Sudoku website http://www.eleves.ens.fr/home/frisch/sudoku.html
00676     "...G...9..4.....6F..L8..."
00677     "CEIN.HDM.OF.1L..A..9PJ.4."
00678     ".....A...L..JBN.2.D.1...H"
00679     "P49...JB23.AD..7E..C5F..."
00680     "A1H....F.N5....I.BL...26."
00681     "....7..C.6...H4B..1....I5"
00682     ".F.P...I..B..7.5.L...9..."
00683     ".L6A...5OF.8P...K.NE..734"
00684     "B2.E..L...1J.5....O7.K.AP"
00685     "O.5.CB1.P....3EM....2L.H."
00686     "2..MJ.A...9.3.7......P.8C"
00687     ".....CF.DPG62N.E...OH.M.J"
00688     ".DL..OM..IE.B8..NH...3..K"
00689     ".CO1F.B.N.AH..P.78.JE...D"
00690     "E..6.....H......4M.KIB9.."
00691     "N.J..6......C..1.5.G..H.."
00692     "...75LG...6..1..CI..4.E.."
00693     "9K..6.....HGN.O2P.4......"
00694     ".OA..IP849...2.K3...7GN.."
00695     "..G....N...P.D9....A...C1"
00696     "J...M.NAFE.4..23.7....8L."
00697     ".....J.H9CD1LP..GO....4ME"
00698     "48NK..5.M......JL.......9"
00699     ".I.OG....835.A.DH..P....."
00700     "35......L.J..E....8IG.67B"
00701     ,
00702     // 19
00703     ".N..JG..O7591...8I....L.."
00704     "FG.M.B8...P.E...CJ..H...."
00705     "...........G.4.H.D.O.NJA2"
00706     ".....J.EN4.L6MA.B.2......"
00707     "HE..2..DC.....F4KMA.B.9O8"
00708     "M....62...47C19......E5.."
00709     ".I2.8M.JGL...ADN..K..3.F7"
00710     "..H3.5..89....I.J.....NL."
00711     "1B..9.FAP.6.N....537.H..O"
00712     "......1..N...O...LC.68.PG"
00713     "KOA.FNBH.....7.C.....M..6"
00714     "45.ECP.I..N.F.J1...MK.79."
00715     "I.L..8.O..9.P...A...2.1J."
00716     "..621.D.M.....B8LG..P..CH"
00717     ".HP.N7E.L1....3..B..O.G45"
00718     "....BIO....5.C.P...FN48E."
00719     "...FL.....2.DH..17..59O.."
00720     "..I.MF..2G.N...A6O.HC.PB."
00721     "72.1..L...IM.96E.45G....."
00722     "..9...7M..A.O...I...L...."
00723     ".C.JA.........1.....E.48."
00724     "O.BI.......PHL.6..1....5C"
00725     "G6M...N4FI8...K..H.E....."
00726     ".L..4.917....BE.G8F.M.I.."
00727     "8F......5.O3..4...9.....K"
00728     ,
00729     // 20
00730     "5.PC..7..J..I...3..H.M.2L"
00731     "H.......F..DA..N.G...9..P"
00732     "...3LCP2.54.71.B....J.8.."
00733     "76M8...3A...H..C.D.FO...."
00734     "...DK..GI..B.L.6.8.14...."
00735     "A......M....D.6.N.P....O2"
00736     "...E5BLF..92..3AJC..6I..."
00737     ".PNJ.6..E7A.8..IM.OL1.G.C"
00738     ".L3...O.N.5.KI.46.....9E."
00739     ".I.G.A..28.MBP...E..HJ3.7"
00740     "J.74.L..D1O96.A3.M...GI.."
00741     "E...1...K....J...P6.7.C.9"
00742     "8M..A9JO.F.P..1...4.E3N6."
00743     "...I.3.7.......EL.CD..H.."
00744     "....DE2..P...N.........K."
00745     ".O.7.FKI1..GJ.N.....9.P8."
00746     ".89..H..BNM73D.KFJ..I.6.A"
00747     "PDBN...9M..C.....O.6..7.."
00748     ".F.K...4..LA9B..C.E75..GN"
00749     "G.A.....7.8.....H....O.3."
00750     "B...C...4......8K.3.P...."
00751     "DHE5..FA...J.3..B.2.KC.98"
00752     "...F...5....N..J9......I."
00753     ".J...P..O.BK....I.M.3..5."
00754     "9...8.B.6.D.M.I..H.5G.J4."
00755     ,
00756     // 21
00757     "..6F.....5..3.....H..A.M2"
00758     ".....3....I8.A.MC.KJ.LNG."
00759     ".I.7N..K.2..6...3D..B.O85"
00760     ".3A.PF.D8OBK7.2....L6.9H4"
00761     ".K..CBML.....O.A8.G4.D..."
00762     "1.4.AGL..M5..F.O.9....P2."
00763     "..I.........8......N4E..."
00764     "J.C8.1.6.3.LO.K7AG2P9.H.."
00765     ".2.3BH..9.A...G......O..L"
00766     ".H..M8.J.....NI1.LEF....B"
00767     "I5..4.....G.27..K..3.M..H"
00768     "P..E..I.A..3B.8....G.2..."
00769     "AJ......NFK.I.O9476..G.1."
00770     ".976...E3H....M5.F......O"
00771     ".F.M3.5.GKC4.HJ.N.....ID7"
00772     "..L1K..9.J37.ID..B..E6..."
00773     ".82OH.1..PNML...E..C...J."
00774     "....JLFN.B..G..6M..H..D.9"
00775     "...C.A...I.6.......K.5..."
00776     "E.G.I.....O....J.8F......"
00777     "..M4..9.D.7.K.FE.3O......"
00778     "H.N.....14E..B3L..8I...AG"
00779     "K.O.62.PM...N..H...18C.9."
00780     "LC..8.3...2...H.G...J..4E"
00781     ".B..9NK.E....C6.P.4D.71OI"
00782     ,
00783     // 22
00784     "A..F.N......M28DC.LI7..OJ"
00785     "..B...D.M.6....9.....2A.."
00786     ".2..I.56.B...J.MEH......."
00787     "O7...HE...BA..G2........L"
00788     ".H6J.2...G.7NDP.A...8..C."
00789     ".PN35..B..869.2.GA..K.C.."
00790     "....EM13OD.N...49K...7..."
00791     "9G..C....IJF5.B..7.3....."
00792     "HD.....JN....7...EF....9."
00793     "1.OA..G.KL....H..B.CP...."
00794     "..CE.......2..9I....3...."
00795     "FJ..83P.E..K7.NL15H..I2.."
00796     ".4..GJ...6DIB...P...AHL.C"
00797     ".1I.2.M....83.F..4.NBE..."
00798     "L3M.OD.H.AG..4.....69...F"
00799     ".8...5H.3.....M...D..K..4"
00800     "3..4..AEDO7J...5..9..G1.."
00801     "..2N9.8F.P.OIGC.L6..E.H.."
00802     "C...1.7..K.L6.4EO.8.5...N"
00803     ".IG.H..M..E...1A2N4..8.F."
00804     "6..5J..N1...2..H.IGA...P8"
00805     ".L...O...H...C....M5G..A."
00806     "..F...3C.7.P..5N..B..DMH9"
00807     "291D..6..M..H.7.3.J.N..B."
00808     "....MK..29F.G.DO4...6.E35"
00809     ,
00810     // 23
00811     "....B12O3..D..F..KPL.E4.7"
00812     "1M..GL..H..K.A.....39.P.."
00813     ".8.3.4.....7..6.F.....CK."
00814     "P.O...758.2..MC.....1L.A."
00815     "...HFK6.A..8...9B...2...J"
00816     "91.KJE..L.5O..GD.....4..."
00817     ".I..3..D.2.....C4MLAK..N."
00818     ".4..6IA.P7.....B9......3."
00819     "M.F...4.J...8....N.H.1G7."
00820     "..5P.N.....C.731.I.E.9A.."
00821     ".....GO.KDL......BA......"
00822     ".3A..F...9..K.EI5.7..6.DN"
00823     ".G.54.L.....PH..3F6....2."
00824     "....P.....G..2D.OH.1B...C"
00825     "6.EM.7N....3.B4..DC..K1P."
00826     "B.9.....I..5N...7OGK...46"
00827     "OF.GD6HP..JM..BA8.I.C...."
00828     "8.L7...........P.3M5...92"
00829     ".EM.....45IF7....2.CJ8DL."
00830     ".6.4.8..NA.2......9....GI"
00831     "2..A1DCN..3G.F5.L..I..O6H"
00832     "..BIO..1.H.L...G........."
00833     "C.P.....M8.9O..5A..N.JK.D"
00834     "H...N...FOA4..73....5..CM"
00835     ".D4..3...6BE..N.2JH8..L.."
00836     ,
00837     // 24
00838     "LJ.FH2...K....359.E.B6.N."
00839     "...EML1FC.PJ.A.8I....2.K4"
00840     "9........G1..6..K...PAL3C"
00841     "P...C34..8.N7.........DE."
00842     "...7....E..IO...124.J5.F."
00843     ".8.L.PA.2..31FG....N..C.I"
00844     "F.G......M........2.K..1."
00845     "....2KH6.JOD..9.L..G...B."
00846     ".6O3..G...4.NJ.H.PB...5.9"
00847     "I...K..LBN...E.76.A....8."
00848     "D.B.L......8.3.C.KM.6...."
00849     ".C593.I.N4.26MB..1..L.K.."
00850     "M.F6......DA45.9..N.I3..B"
00851     ".G..79.H...KJ...4...AN.2."
00852     ".KH...BC....LON..7..D.8.F"
00853     "2..B...MP....7OEJ4....6.1"
00854     ".4....2O.9......N..1....G"
00855     ".....G.JF.2..L.6.5......."
00856     "C9A.G...H1...PJ..L.3.8.MN"
00857     "...1......M.....O.P8.K3J."
00858     "...N.HP.K25G3..JC8..1M..."
00859     "..2K.FC34.A....N7..9.LB.."
00860     "..65DJ..L..C.4.1...BGF..."
00861     "OF..E..7.B.......634...D."
00862     "G.3..N.I9D7PM8KF2....4..."
00863     ,
00864     // 25
00865     ".1..I8.P..6.N...BD...3O.."
00866     ".9.6...E.M43.8..AK.2J.1.."
00867     "...JKL...FA...P.I4...DB.."
00868     "E...P.I.B.7.1..J.HC...98."
00869     "..5M8GJ.KD.O...N3..1AI..."
00870     "K.2C4.M.N..J..I.......H.5"
00871     "N..B9O.D...KH6.E...C...7I"
00872     "DE..JK4.....L.1B7..68PN2."
00873     ".....P...C..F.7...L.O9..."
00874     "...35.H......92..M.4.EC.1"
00875     "P..IL..H.........1..3.D.."
00876     "....B9..8.3I5.C...K...F1."
00877     "FH....2O..D.4M.P...A...GC"
00878     "JA.......KF.......4.EOMIP"
00879     "3.7GNF...A.2OB9C.E5.HJ..."
00880     "2.I.1.......AO5.P...K.3.."
00881     "..H....L..M.CIJ..7...4..."
00882     "GO.9..KF.I.P3...E.HJ...N7"
00883     "5.37...B.E...4N..O.8....."
00884     "4B...7.9O.HL..E2C3.K51.M."
00885     "L.O42...D..AJ.8...GH.N..E"
00886     "9M.8.H..LG1..N..5.E..F7B."
00887     "......FAC..5M..I6J.B4...G"
00888     "...F..82..P.E......36HK.L"
00889     "B.J.G5...O.H2..98.7......"
00890     ,
00891     // 26
00892     ".CNPHK.53.O9F..D.78..J..."
00893     "J.....F.DB...7.G..PAE...L"
00894     ".6.........5.4A......I..."
00895     "A..L.6.E.1JG....5.H.2...9"
00896     "..G4..P...E2N.M...C..FB.1"
00897     "..PKJ...G41O..C.N..H....."
00898     ".M..I5L97J.3H...E2.8...D."
00899     "1.4..ON.83G.P.D59..C.BH.."
00900     "..2.9.......4.F.3.6..O.7."
00901     "3F.7.MEC..5...2..4K.LN8.."
00902     "...I........MF7.6AOG..LE."
00903     "C1.3..JG..D.9...4..N...68"
00904     "...M7L9..NHA...FJ.I..3.C."
00905     ".A...P...5...E3.8M..K4OFG"
00906     ".....C.6KIP...8..3.DJ...."
00907     ".2.J...3C..7.D.9A.EF6L..."
00908     "4...3.6N.....L9.H..P8...2"
00909     ".9.C.4H.......P....1..FJ3"
00910     ".LD.K87.1.BM5AJN....4H.G."
00911     ".B..MAI........47O.LD...."
00912     ".G....3....F..1..9..M..K6"
00913     "P7.A..B8.......2....I.3.."
00914     "M..O....9K2..6..1.N.FE.L."
00915     "....E...A..N.J.IG8...C.9."
00916     "6KL.4...FCI.A.....5J.2D.N"
00917     ,
00918     // 27
00919     "E..I...M......L....D...BK"
00920     "F..BH9.K.A2.7..E4.P.6..M."
00921     ".6.J..PD8FE.IM...K...54.."
00922     "L...8E...IA..HC........7J"
00923     ".....7H.4.JK..DOFC....9I."
00924     "9...7A.5.B.M34E.KDJ8....."
00925     "8...BD....O..7....CP.E.6."
00926     ".1.3..8....D...2.ML.B..5A"
00927     ".E2.A.O.7..1..I.659..8LD."
00928     "KF..M2...PL......A.G..N3."
00929     "...76N.1..CBG...DPK..O.J2"
00930     ".JK...6B.9..P.7.N.EMFDG.5"
00931     "N....G.F.8....OH9.2...E.7"
00932     "....4.3....F9.....5.NC.A."
00933     "M.A.GL.J......5..4.7.91.."
00934     "C.8NE.5..6..M.....BJ17..H"
00935     "7.6...NL.41.AC.I8...GJ3.."
00936     "...53P.GM2.L..F.....K.68."
00937     "J.4.D..H..IG..8K..35.N.FL"
00938     "P.F...93.D.....A.1......M"
00939     "..7.I...1...DF..PJ.4.MA.."
00940     ".KN.....5H..O.63.E.2....4"
00941     "....1...O..A2..DCH8B..KE."
00942     "3.HA.6BP.....J1957O..28.."
00943     "42JO.I...K5C......6.P.B.."
00944     ,
00945     // 28
00946     "...G87..O..F.N..CH6..D..2"
00947     "C16..N....DL.3.E........."
00948     ".LN.EK..D..O.G6.412....5H"
00949     "K...2........59M...P..3.."
00950     "..A9.M.6....8.E7O3..K..LB"
00951     "7..8B.1.EP.....4.L.6.C.9."
00952     ".3.6...9.85.A2F.....B.EP."
00953     ".D4K.L..NA....C.M.E..7..."
00954     "L..P.3H.CG.7....DKF..I6.."
00955     "5EH.G.7.6.1....J....D3K.O"
00956     ".6.....G.K.E..I2.4J......"
00957     "..ICFP.8H7.2.O.B.NM5..G.."
00958     ".M..D9..BE..J..F..I7..LAK"
00959     ".BE.L...31.M7FK..C9..8.DN"
00960     ".2O......D38C...E...F.P.."
00961     ".A.....M..NB..3.J.7E8..2."
00962     "...O...B..6..C.8KG4..5D7M"
00963     "....M8..I..9..AL1.O.3HBNG"
00964     ".C..4....L.....D.F......."
00965     "J..5NF..G...H..6..C..1..."
00966     "D..N..O....G9.J.A..I...8."
00967     ".F.H1BN.K.O.4.8.6.3.9.M.."
00968     "B...I....9K..6..2...G.H1."
00969     "O...7.CJMI25N...HDKBPFAE."
00970     ".....28.F..C........O.JK."
00971     ,
00972     // 29
00973     "9.K..6D.I5...........H..."
00974     ".I.E..BK...GN...6.L...3.."
00975     "7....2..L8E.K.D1.P5I.6..A"
00976     "..N.LEH.A32..CM9........."
00977     "..2....9N...3.IC...J.KF8."
00978     "......GA..C.7JPNI3....6L."
00979     "....E.J.8K..I.....97NG2.B"
00980     "O7..3HI...M.....DCF5..914"
00981     "L.M.4.3.19.D..2......F.K."
00982     "B....F...O9.6ANG.2.PH.E.5"
00983     "8KDM...5.1....G......P..6"
00984     ".4.H.L.C..J2....G..3ION.."
00985     "C.A..J..E...1K......92.5."
00986     ".9O.NP.2...IA....H..G..7."
00987     "...I5..O.N4.H...2DCKJ...E"
00988     "56....1.D..AJ.....7.L.O.."
00989     "K.8.H.7.9.5....AC..O..G6F"
00990     "3..........O..C.F.P6K.5.."
00991     "...OC.4J2.3E.9...N.H7..P1"
00992     ".B.7.K.....6.MH.LJ..A...."
00993     "I..4.........P..E7D9O.B.H"
00994     "E.3G.OP...I1CBL..FN4..82."
00995     ".A..9N.8.E...73O..H....4."
00996     ".M.C.3....DK..EI......JG."
00997     ".HP..D..FB...NO.1KJ8.AL.."
00998     ,
00999     // 30
01000     "....L.1.8H.CO..P....FA..."
01001     "P1.2.4CO...K..A..3H8...7."
01002     "I..H.G.5.B.6.M..A24.K..9."
01003     "....6I.KF9..5.P.J1.BDCE.M"
01004     ".A....2...F..L..E.M.6.5O3"
01005     "7..1.C...8.L9..4P.5.G.K.."
01006     "JO.5H.M2.I.7.F.6D..A4..NE"
01007     "E.3.NO....K2...LG..7JM..."
01008     ".9F.CJ.H....A.NKB.1..2.5."
01009     "2LB...5..7.P36H.M..N...1D"
01010     ".....P..B....46.HJ......."
01011     "B4..7LI.C.GD2...KA.3H...."
01012     "K5......6J1.........27O8P"
01013     "LP...5K.G..JB3.......1.M."
01014     "..EG...4.F.NKC...O..9.B.."
01015     "..MI...D32AGP..5O...74.BN"
01016     "FC74.....1..LO..8...5.D.J"
01017     "..JN....H...E.I...DPA3.6."
01018     "AE.......O3F..5.........H"
01019     "...8..6......24.9G....I.1"
01020     ".M....8.9..O1.F.C.EL3...A"
01021     ".N...E.3.....I7M1...ODG.K"
01022     "1......P.N9..D..5........"
01023     ".I.P..FGOCMA.......J.5..2"
01024     ".GK....7...3.....92..B.L4"
01025     ,
01026     // 31
01027     "...H....GKM.43..B.D......"
01028     "15I.C....8B.6D.7G....A.H4"
01029     ".7...F..B...J.E16.N....3."
01030     "...D.1...6L7.H.5K....P98F"
01031     "KJ.AF.5CHO...NP2M.....B.."
01032     "4..K..I9.M.DNP..A.3..E5O6"
01033     "PGC...HE.....I5..M...7..J"
01034     ".B.EJ..G.5..L....D.48.2.."
01035     ".D....N.4.J.2A..H..5..F1."
01036     "8....AJLD.7..OM...1B....P"
01037     "CH...N..7.........B3....."
01038     "I..O.JL..P5...3......KH.8"
01039     "D.259.E......6.......L3.."
01040     "...3K6.B.AE..74N25H..G1.."
01041     ".L.B..41.HC...G.OIP8..MN7"
01042     ".........2.C.4.L....69.I5"
01043     "N...7.C...69.5.A......PKL"
01044     "....L.G...13.BOMP.82..D7H"
01045     "...C.H..5.P.E.K...I7....."
01046     "JO..P.96ABI8.....C..N..4G"
01047     ".NA8H.32..O4..IB..L9G..J."
01048     "..4.GD..M.3..27INJ.O....."
01049     ".C9L..A..J.....6.2..I..F."
01050     "BK...4..F.A.CL..87.1.O.M."
01051     "6..P.I.5...M..N....F....D"
01052     ,
01053     // 32
01054     ".6OL.3GB.I.1F.EP..9..24.."
01055     "..1.P.....K....N.2.....ID"
01056     "2.8.K7..J...6..1F.......A"
01057     "...D.8.4..29..LJ7.HMKPF.."
01058     "..I.9N...A..P.M.DK...E5.."
01059     "94.N...5..F..E.C182..BG3."
01060     "8D..3HC....6G.....P.F.72I"
01061     "C..I.E.7D....8BG.F...6..."
01062     "......L....N.24..I..1K.DJ"
01063     ".27HG.NF......I..L..E.A.."
01064     "L...N.I8F6.H.9K.3O..B..5P"
01065     ".9...L..25.B14F.N.JE...7K"
01066     ".1...9B....GJ.8.A.5C....."
01067     "....CPK..J....5.M.7.6.H.3"
01068     "..F7..3..O..N..B8....421."
01069     "AM.8....P...71..26N...3G."
01070     "P....D.2.78.O..5CJ.GA.BH."
01071     "6..4.F...3...K9A..1...J.M"
01072     ".I2.E......JM.N...B98..P."
01073     "FC..7..6.EI.D.G...3H5..KN"
01074     "I8NO.4F.9..DB....5......."
01075     "5..1...G3.MIH.A.9..N....."
01076     "KG.62..1.....L3.....IJE.F"
01077     "....D.6.AC4.9.....OL.HP.."
01078     "..EA.5O.L.6.......D...9N."
01079     ,
01080     // 33
01081     ".CH3.L..D4F..I.........1."
01082     "G..K.....7.O.......L.42N."
01083     "A.D...5O8B...39G.4..I...L"
01084     "1E2OB....A8N..6FCD9.H...G"
01085     "IN..4..3.....J..5OM....9."
01086     "...JEMP..9G8..D7......BA."
01087     "B.M9..L....6...2.FI.KJ..."
01088     ".LN.386A..BH....O.J.2..7."
01089     "7A6..2..3N.....4KP..G8HIC"
01090     ".1.....J.CK3....HB..5L4.."
01091     ".H......P.I.57....G..21B4"
01092     "....7.....EP1....3.2..A.."
01093     ".59.1FI.L8.MJG.B..AH....E"
01094     "NI..D....O3K..A.P9..8F..."
01095     ".O....A..E2.8.HN.J7.P...."
01096     ".MC..P....H2...A7..ID...1"
01097     ".6.....M.J.14.BDG.3.O9F2."
01098     ".......CG.........4...M.."
01099     "HDL...8N7.......FK2C.E..B"
01100     "..KP2I.F.3...N7J.E.6..L85"
01101     "D.E...C.4.7B..I....A.1..M"
01102     "J..M..7..D.A..4...ONBG..2"
01103     "9.7.6..K..P..O....D...8.."
01104     ".2IN..GE1.D..8...MK.CPJH."
01105     "FG..8B.2.L..KH.....1.5E..",
01106 
01107     // 55 16x16 instances (mostly harmless) from janko.at
01108 
01109     // http://janko.at/Raetsel/Sudoku/301.a.htm
01110     // 34
01111     "D92.....G...43.."
01112     "4CF.....9D.2.6EB"
01113     ".E.1....F.8BC..A"
01114     "G56.....A3C....1"
01115     ".7G5A8....61...."
01116     "2...C....B7....."
01117     "..AE.964..G....."
01118     ".F9.5.7.4......."
01119     ".....29....A.C.."
01120     "........645D.1.."
01121     "....D....1.C.B7F"
01122     ".....E.C2G...8A9"
01123     "B..9.G52.....EF6"
01124     ".256..F.....D.B."
01125     "E13.6.D........7"
01126     "A...8BC3....954."
01127     ,
01128 
01129     // http://janko.at/Raetsel/Sudoku/302.a.htm
01130     // 35
01131     ".DG1.C.BE..3.4.A"
01132     "..7B.62..41...59"
01133     ".......D.....G.."
01134     "..49.7.3.B6..FD."
01135     ".9..G...C......4"
01136     "G..46....9F.3.B."
01137     ".C5.1...BE.86..G"
01138     ".B.....E2G...D.."
01139     "..3...596.....1."
01140     "F..C2.76...B.E3."
01141     ".1.8.4D....7F..5"
01142     "E......F...D..9."
01143     ".AB..FG.1.3.C8.."
01144     "..2.....F......."
01145     "8F...BC..62.97.."
01146     "1.6.A..59.C.GB2."
01147     ,
01148 
01149     // http://janko.at/Raetsel/Sudoku/303.a.htm
01150     // 36
01151     ".....D.3..7F.A.."
01152     "...B1.F8....26.."
01153     ".F.3...6D..AC..."
01154     "AGC.9.5..8....BD"
01155     "E.FG5...7...A.9."
01156     "2.7.....89A36.F5"
01157     "...1.9...CBE...."
01158     ".3....A.....BG2."
01159     ".1B2.....7....6."
01160     "....B16...3.9..."
01161     "5D.4F3EA.....2.B"
01162     ".E.A...9...D83.C"
01163     "4A....B..E.8.FC9"
01164     "...EA..G1...D.4."
01165     "..GC....FD.B1..."
01166     "..D.47..6.C....."
01167     ,
01168 
01169     // http://janko.at/Raetsel/Sudoku/304.a.htm
01170     // 37
01171     "....9...5...3B.."
01172     "...D13.7.4.....F"
01173     "637...2..81AC9.."
01174     ".2G..5.......18D"
01175     "...F4...3...8C.."
01176     "E.D.7..6..G...A5"
01177     "C5.6..3....F.2.."
01178     "4.A...1D72.9..B."
01179     ".E..D.9CA6...F.1"
01180     "..9.5....E..D.26"
01181     "B6...4..D..5.7.A"
01182     "..F4...A...C9..."
01183     "AB4.......2..G6."
01184     "..68FBD..5...A47"
01185     "1.....6.9.E4B..."
01186     "..32...5...B...."
01187     ,
01188 
01189     // http://janko.at/Raetsel/Sudoku/305.a.htm
01190     // 38
01191     "..16.E.8.BF.4..."
01192     ".5...9D......A73"
01193     "..3...B.78.D.6.."
01194     "......1...9...BE"
01195     "C..1D..6B5..7.A4"
01196     "...5.F.98..32.DG"
01197     "3.....C..D.A5.E."
01198     "....3B5.F7...9.."
01199     "..5...6C.2AE...."
01200     ".3.BE.2..4.....9"
01201     "F9.2A..B5.7.G..."
01202     "EA.G..756..BD..1"
01203     "6C...8...9......"
01204     "..9.6.47.E...D.."
01205     "2GE......C6...F."
01206     "...3.CG.2.D.65.."
01207     ,
01208 
01209     // http://janko.at/Raetsel/Sudoku/306.a.htm
01210     // 39
01211     ".....D5..7.169.."
01212     "..4..2BE8.G..A.."
01213     "8DA....752..BGF."
01214     "G.9EA.86..3F2..."
01215     "C..4G1.....7F..."
01216     ".G.A...315.6..C8"
01217     "E.5..F7.4G..1.A2"
01218     ".91..BE...D.54G."
01219     ".68D.3...C5..B9."
01220     "4E.5..9B.31..F.G"
01221     "3B..E.G1A...C.4."
01222     "...95.....F83..7"
01223     "...C9G..F1.5D8.B"
01224     ".468..DFC....3E5"
01225     "..2..E.A7DB..C.."
01226     "..EFB.3..86....."
01227     ,
01228 
01229     // http://janko.at/Raetsel/Sudoku/307.a.htm
01230     // 40
01231     ".BC..32...9..D.."
01232     ".3..CB...52A.9E4"
01233     "7E.A...D8.6B2..5"
01234     "..9F..A.DC7.B6.."
01235     ".15..2.E..3...4."
01236     "4GD81.3C...7..6F"
01237     ".C.9....E.4.G..1"
01238     "..E3..59G.FD.B.."
01239     "..A.2E.FC9..84.."
01240     "B..E.9.4....F.A."
01241     "16..A...57.F3E9B"
01242     ".9...6..4.E..7G."
01243     "..64.C85.2..DA.."
01244     "E..DB1.23...6.59"
01245     "C5G.9D4...1E..2."
01246     "..2..F...DA..CB."
01247     ,
01248 
01249     // http://janko.at/Raetsel/Sudoku/308.a.htm
01250     // 41
01251     "G.E37..1.....6.."
01252     "96..E..3..G5D.F."
01253     ".7..64.CF31..29E"
01254     "....F...8.9E437."
01255     "6AF...D.3..1...."
01256     "..1...B5.8F47..3"
01257     ".83B2.47.G....61"
01258     "..79.6...EC..8.G"
01259     "E.C..2A...8.FG.."
01260     "25....C.GA.78B4."
01261     "7..AD3F.24...E.."
01262     "....G..B.1...C52"
01263     ".4A2B5.D...8...."
01264     "FE8..G2A1.73..C."
01265     ".C.78F..4..2..E5"
01266     "..9.....E..G34.8"
01267     ,
01268 
01269     // http://janko.at/Raetsel/Sudoku/309.a.htm
01270     // 42
01271     ".G.4..1E6.9...2."
01272     ".D..4G.C.....9F7"
01273     "..79.D...5C.B.G."
01274     ".EFC7...G..D.5.3"
01275     "5...C...E6BFD..."
01276     "...1...5..D.CB.2"
01277     "7.CG29.D3...E8.F"
01278     "94...EGB.2.C...."
01279     "....E.2.583...CD"
01280     "3.D5...89.FB7G.E"
01281     "4.1E.F..A...3..."
01282     "...F1B3G...E...9"
01283     "F.9.8..1...G23D."
01284     ".A.B.4D...7.5F.."
01285     "8CE.....1.25..7."
01286     ".7...5.3F9..G.8."
01287     ,
01288 
01289     // http://janko.at/Raetsel/Sudoku/310.a.htm
01290     // 43
01291     "...4.1.9..7...B5"
01292     "6E..2.8....CGA.."
01293     ".51....B.D....6."
01294     "B.9..E..G..A...7"
01295     "..7.5F9G..48...."
01296     "..29..3..F..5.7."
01297     "G.BD...837.E..94"
01298     "......7E.1.6A2G3"
01299     "94GA7.2.63......"
01300     "5B..A.E18...79.2"
01301     ".1.8..6..4..BD.."
01302     "....G8..EB92.4.."
01303     "D...9..A..1..G.6"
01304     ".3....4.C....1E."
01305     "..4B6....E.7..2A"
01306     "F9...5..A.3.4..."
01307     ,
01308 
01309     // http://janko.at/Raetsel/Sudoku/361.a.htm
01310     // 44
01311     ".G..5.2.E.FA.4C."
01312     "AB..G....35.17D9"
01313     "53..4AC..DB....."
01314     ".6.C3B..2.8.5..."
01315     "1...A....E.D9CG3"
01316     "GDA9.4..B.1.6E.."
01317     ".FB.1..E9....D.8"
01318     "C..3.59G48......"
01319     "......F38G2.7..4"
01320     "6.3....A7..9.8E."
01321     "..CE.9.1..4.DG35"
01322     "89GD2.4....6...C"
01323     "...G.C.4..958.7."
01324     ".....1A..F78..42"
01325     "4871.3G....2..9A"
01326     ".C9.72.8.6.4..1."
01327     ,
01328 
01329     // http://janko.at/Raetsel/Sudoku/362.a.htm
01330     // 45
01331     "A...18..79..C..6"
01332     ".37.A2...FD...E9"
01333     "G14D..5...8C.A.."
01334     ".268.E7.3A....D5"
01335     "3...D1...7A2.8.4"
01336     "7CF.9..4....D.2."
01337     "5..63.A28...1CF."
01338     "...1.6...3FD..5."
01339     ".A..FC6...9.3..."
01340     ".D2F...3A5.1E..8"
01341     ".9.G....D..7.F1C"
01342     "E.C.G9D...3F...7"
01343     "17....9B.2E.43C."
01344     "..9.E3...C..5D7F"
01345     "FE...AC...G5.29."
01346     "D..C..2F..73...E"
01347     ,
01348 
01349     // http://janko.at/Raetsel/Sudoku/363.a.htm
01350     // 46
01351     "3.8.BD..5F72E..6"
01352     "..G..4.7E..6F5.."
01353     ".AF.2..C....9G73"
01354     "59C...FE.AG....."
01355     "C5..1..F.4.G.E.7"
01356     "F..2.C..B13...GD"
01357     "4..B73.D....C..."
01358     "GD...A...C.7B48."
01359     ".G5FD.3...9...BE"
01360     "...C....6.E1G..9"
01361     "28...7E1..B.6..4"
01362     "1.B.5.C.3..8..AF"
01363     ".....ED.16...345"
01364     "9C21....7..A.8E."
01365     "..EA9..3F.8..7.."
01366     "6..5827A..4D.F.C"
01367     ,
01368 
01369     // http://janko.at/Raetsel/Sudoku/364.a.htm
01370     // 47
01371     "1.....6C.4G.9BA."
01372     ".G6..F.9A.D1...2"
01373     "...D7G.3F...41.."
01374     ".3A.2..1.759.E.G"
01375     "B8..D.F.C.2.A..."
01376     "C....1..DBFA2..5"
01377     "..FG.E.....58C9."
01378     ".25A3.C.G..E...1"
01379     "3...4..B.G.DE78."
01380     ".C78A.....3.12.."
01381     "5..1FC37..E....9"
01382     "...4.2.8.F.B..CA"
01383     "A.4.6B7.5..F.9D."
01384     "..8C...DB.975..."
01385     "9...85.E3.A..46."
01386     ".5D7.A9.E2.....8"
01387     ,
01388 
01389     // http://janko.at/Raetsel/Sudoku/365.a.htm
01390     // 48
01391     "..D.2...5A1....F"
01392     "E21F..9..6.D...G"
01393     "7A.9G1..2E.4D..8"
01394     ".B64.3FA...8.E.2"
01395     "...3...F...G2A.."
01396     ".F7...5.8D4.B.3."
01397     "4....C.....F8.D1"
01398     ".G....B3A2.....6"
01399     "3.....4CF8....6."
01400     "94.B1.....D....E"
01401     ".C.A.E8D.B...15."
01402     "..G8B...1...C..."
01403     "B.A.8...6F2.3DE."
01404     "2..16.E5..A39.84"
01405     "6...9.3..5..1C2B"
01406     "8....D12...9.6.."
01407     ,
01408 
01409     // http://janko.at/Raetsel/Sudoku/366.a.htm
01410     // 49
01411     "3....2A.4F.6..G1"
01412     "ADF4..3..5....E."
01413     "..5G..1E....FAB."
01414     "..E.GF75..B..93."
01415     "B...17...A629..."
01416     "...EFG..7.516..C"
01417     "63..D...G...E42F"
01418     "2....8639...1G.."
01419     "..B8...76G2....E"
01420     "5C32...4...E..1G"
01421     "G..62E.9..D4B..."
01422     "...D5CG...A3...7"
01423     ".G7..5..84F9.B.."
01424     ".F6B....5E..21.."
01425     ".5....B..6..7EF9"
01426     "E4..A.9F.BC....5"
01427     ,
01428 
01429     // http://janko.at/Raetsel/Sudoku/367.a.htm
01430     // 50
01431     "B........45DC.6A"
01432     "4.F...639.CA.E.."
01433     ".9A...CD26.8F1B."
01434     "6.C3.7.8.F..9..."
01435     "D68.E..B...5...."
01436     "73...8A5..9.2..."
01437     "A.G1..9..26..D8."
01438     ".C9.......81A6E."
01439     ".574FA.......G1."
01440     ".AD..37..G..4F.E"
01441     "...9.G..452...CD"
01442     "....B...F..9.725"
01443     "...B..G.C.F.12.9"
01444     ".16AC.5FG3...8D."
01445     "..2.36.759...C.F"
01446     "F8.C194........6"
01447     ,
01448 
01449     // http://janko.at/Raetsel/Sudoku/368.a.htm
01450     // 51
01451     "C..B61..G...F.AE"
01452     "4E8F...A.....DG."
01453     ".D..F3.E1.5A..6."
01454     "5.....GBE9FC..82"
01455     "..5EB.D8...1.F.6"
01456     "..AD.72...6..3.8"
01457     "...3..E.9FB85..."
01458     "6.B4..1....2CAE."
01459     ".3E9C....G..D1.7"
01460     "...CEG3D.7..A..."
01461     "A.F..B...CD.EG.."
01462     "D.7.1...B2.348.."
01463     "FG..8EB17A.....3"
01464     ".4..D6.G3.CE..5."
01465     ".62.....D...74CA"
01466     "3B.A...4..9F8..G"
01467     ,
01468 
01469     // http://janko.at/Raetsel/Sudoku/369.a.htm
01470     // 52
01471     "...E.6DB...2.8.."
01472     "....5G.3.9F8C1.."
01473     "981....FG....7.."
01474     ".3.F8....65.2..9"
01475     "3G....4A5D..7.F."
01476     ".A.D...2......64"
01477     ".2.4C.F..A.G...3"
01478     "..F.D.....6C.21E"
01479     "1F9.B2.....E.D.."
01480     "4...E.3..B.DF.2."
01481     "5E......9...3.C."
01482     ".D.3..8142....5A"
01483     "2..5.D6....F1.A."
01484     "..4....86....EDG"
01485     "..3CGFB.E.DA...."
01486     "..G.3...279.6..."
01487     ,
01488 
01489     // http://janko.at/Raetsel/Sudoku/370.a.htm
01490     // 53
01491     "3....1G..5.7.A4."
01492     "FE7C.3.9.......G"
01493     ".8.....5D9G.C..3"
01494     "5G.A6....38.FD7."
01495     "...5G.94.8.27C.."
01496     ".98.E.5C.G......"
01497     "4....7.25.CB.6.A"
01498     "2A.F.......6.5G."
01499     ".F3.5.......4.DB"
01500     "C.B.98.AF.7....6"
01501     "......6.2D.C.9E."
01502     "..6G4.B.81.9A..."
01503     ".D53.C8....E6.97"
01504     "A..2.D467.....5."
01505     "8.......4.9.32B1"
01506     ".4F.2.3..61....C"
01507     ,
01508 
01509     // http://janko.at/Raetsel/Sudoku/501.a.htm
01510     // 54
01511     "..E3.7.1.5.6.B.."
01512     "....G85B92.FE..."
01513     "C...4.36A......2"
01514     ".4.BA......G7..C"
01515     "48.2E...5G.9ADB."
01516     ".....B...C4...9E"
01517     "9A..F42.E1...5C."
01518     ".5C.7.9G8....413"
01519     "BE8....26A.C.G3."
01520     ".FD...7E.931..56"
01521     "AC...G6...2....."
01522     ".1369.85...BD.A7"
01523     "E..A6......5C.7."
01524     "3......A7F.E...5"
01525     "...51.G7CDA2...."
01526     "..G.C.B.3.1.9A.."
01527     ,
01528 
01529     // http://janko.at/Raetsel/Sudoku/502.a.htm
01530     // 55
01531     "G..B..12....73.C"
01532     "..8DB.7CG9A....."
01533     "6.3...D...4E.8B."
01534     "4...38G.21....AD"
01535     "..F.........E.6."
01536     ".E6..75DFG3.B..."
01537     ".7.G.F916EB.4583"
01538     ".B.3.E2..89...F1"
01539     "74...3E..62.5.1."
01540     "9852.CB7DFE.3.G."
01541     "...A.56F431..C9."
01542     ".F.6.........E.."
01543     "C1....F4.B5G...E"
01544     ".D4.EG...2...9.8"
01545     ".....D8974.1CA.."
01546     "B.A7....ED..F..4"
01547     ,
01548 
01549     // http://janko.at/Raetsel/Sudoku/503.a.htm
01550     // 56
01551     "7B..9C.3..6.A.2E"
01552     "4.2...67A..53..D"
01553     ".....ADE.CB.4.5."
01554     "AD8....B7.F....."
01555     ".C...1.A.9.....8"
01556     "F.E8...C.4.D.6.2"
01557     "..D.59.......1A."
01558     ".1.2......7FBDC3"
01559     "BF6EC4......2.7."
01560     ".53.......C2.E.."
01561     "D.G.2.A.5...F3.C"
01562     "2.....1.B.3...8."
01563     ".....F.43....CD7"
01564     ".8.G.E7.C25....."
01565     "C..DG..1F7...2.A"
01566     "E7.A.6..9.18..B5"
01567     ,
01568 
01569     // http://janko.at/Raetsel/Sudoku/504.a.htm
01570     // 57
01571     ".21..BD...EF6G.."
01572     "..6.5.F....D.8.E"
01573     "G4.....EB.7.1.D3"
01574     "C.D..37G..61...."
01575     "AB.D8..9.1.E..F."
01576     "6.F4..G..D..8..B"
01577     "....BD.1F.8.7.C9"
01578     "..3...6..G.BED.."
01579     "..B91.C..E...A.."
01580     "47.2.6.A3.1G...."
01581     "8..3..E..B..F1.G"
01582     ".1..7.3.D..C9.25"
01583     "....GF..28B..4.A"
01584     "5A.8.4.B1.....GF"
01585     "D.2.C....F.6.7.."
01586     "..41DA...7G..C9."
01587     ,
01588 
01589     // http://janko.at/Raetsel/Sudoku/505.a.htm
01590     // 58
01591     ".B...7..4D..E13."
01592     "D......6G.E7...F"
01593     "8.6F....B....7.."
01594     "7...91D..F8C.B.."
01595     ".F.G8.1.3..27..."
01596     ".1.6.4329.7.F..D"
01597     "3..7..5..GBD8..."
01598     "48D.CE....A...9."
01599     ".3...G....C4.9EB"
01600     "...148C..3..A..2"
01601     "9..4.6.7FA5.C.G."
01602     "...EF..5.1.B6.D."
01603     "..5.ABG..7F9...6"
01604     "..3....F....18.E"
01605     "G...E5.32......9"
01606     ".6FB..89..3...C."
01607     ,
01608 
01609     // http://janko.at/Raetsel/Sudoku/506.a.htm
01610     // 59
01611     "...FDAE..6.1.3B."
01612     "1..C...9.D34.6.."
01613     "8A3.4.....2E7C.."
01614     "..DG.3......8.5E"
01615     "3F2.C.....8B.5.9"
01616     ".DE.8..B2C..A..4"
01617     "C8...1.........6"
01618     ".....D.31.5...E."
01619     ".G...E.84.D....."
01620     "A.........1...43"
01621     "D..E..17C..2.FG."
01622     "2.5.AF.....9.D7B"
01623     "73.2......6.B4.."
01624     "..483B.....D.A61"
01625     "..A.14F.B...5..C"
01626     ".1C.6.D..24A9..."
01627     ,
01628 
01629     // http://janko.at/Raetsel/Sudoku/507.a.htm
01630     // 60
01631     "4.8CB9G...D..FA2"
01632     "G..18..A96...E.."
01633     "F9....ED..8....B"
01634     "...D73...2F.G.81"
01635     ".......2....C.F9"
01636     "3.D7.E6...9.4..A"
01637     ".C.4..D9.GA..3.7"
01638     ".2.......7.3.65."
01639     ".3B.5.2.......D."
01640     "6.4..G8.FC..B.2."
01641     "E..G.B...D2.18.F"
01642     "CD.2....3......."
01643     "D1.B.8F...C9E..."
01644     "2....D..1B....G5"
01645     "..5...17D..G9..C"
01646     "7E9..C...468FD.3"
01647     ,
01648 
01649     // http://janko.at/Raetsel/Sudoku/508.a.htm
01650     // 61
01651     "D.B.8.4..5G..2.9"
01652     ".C..6.3...D1.7B."
01653     "GE4.B..52A..FD.C"
01654     "..7.2..E.F9....."
01655     ".2..4....3.D9GEF"
01656     "43.7..A..8......"
01657     "5.ABGD.F..1...37"
01658     "..E......7..6B.."
01659     "..2E..G......3.."
01660     "C5...B..D.F971.8"
01661     "......5..2..C.GE"
01662     "348GD.C....7..5."
01663     ".....91.8..F.6.."
01664     "1.G2..F65..E.89B"
01665     ".8C.54...1.G..F."
01666     "F.5..87..9.A.C.1"
01667     ,
01668 
01669     // http://janko.at/Raetsel/Sudoku/509.a.htm
01670     // 62 // problems
01671     "..EF96...8.5B.C."
01672     "D...FE....1.2A.."
01673     ".86..2..C...57.1"
01674     "C21...BD9..E...3"
01675     "5..1.C...6....DA"
01676     ".G.....7.E.1.5BC"
01677     "B...D1..8...7..."
01678     "..9D..A27.3.E..."
01679     "...3.A.E5B..6F.."
01680     "...5...C..83...B"
01681     "FDB.2.9.6.....5."
01682     "61....5...E.G..9"
01683     "4...8..3B7...EA2"
01684     "E.26...A..G..CF."
01685     "..58.D....4F...G"
01686     ".B.7C.2...5AD9.."
01687     ,
01688 
01689     // http://janko.at/Raetsel/Sudoku/510.a.htm
01690     // 63
01691     "..2..DA6.38.14.."
01692     "...5.F..2......."
01693     "6.8.2.G.....7A.B"
01694     "A.F.....65.G..D."
01695     "...6.8E.52...B.."
01696     "7....2.F.G39..8E"
01697     "8..3679..4.C.1.G"
01698     ".B.EG..18.A....7"
01699     "1....A.8C..FG.3."
01700     "E.A.1.3..D42B..5"
01701     "97..CG6.1.B....4"
01702     "..3...2D.E6.A..."
01703     ".C..B.74.....5.A"
01704     "B.68.....C.7.D.F"
01705     ".......A..1.2..."
01706     "..4A.C8.E6G..7.."
01707     ,
01708 
01709     // http://janko.at/Raetsel/Sudoku/511.a.htm
01710     // 64
01711     "A..95.B.G...8.FD"
01712     "G.D...6FB...A5.."
01713     ".B...1D83.A9G.7."
01714     "F68....G5..1...C"
01715     "..28DA9..5FC...G"
01716     "..G.87.2.A4D.6.."
01717     "....3F.....E.CD9"
01718     "9C5D......G.FA8."
01719     ".71B.6......5842"
01720     "D5F.B.....26...."
01721     "..9.127.F.85.D.."
01722     "2...E35..CB719.."
01723     "6...F..BE....734"
01724     ".F.ECD.3479...2."
01725     "..AG...9C1...F.8"
01726     "39.5...1.D.FB..A"
01727     ,
01728 
01729     // http://janko.at/Raetsel/Sudoku/512.a.htm
01730     // 65
01731     "....G5D.C1...B2."
01732     "6...E.BC.G..D8.."
01733     "D13C..7..4..5G.."
01734     ".72B48..5.6.C9.."
01735     "....B9E....F4.12"
01736     "...A..FD7B.C8..3"
01737     "E6F..1....G3.DB9"
01738     "B..4.2.89.1...G."
01739     ".5...7.ED.C.G..8"
01740     "C9D.14....E..A35"
01741     "8..2D.591A..6..."
01742     "7G.36....259...."
01743     "..6D.E.5..B4A27."
01744     "..95..2..8..B3D4"
01745     "..7G..4.6E.5...F"
01746     ".B8...97.C32...."
01747     ,
01748 
01749     // http://janko.at/Raetsel/Sudoku/513.a.htm
01750     // 66
01751     "D...9A..6.F4.3.C"
01752     "....B6..5A.E9D.."
01753     "6E5......D..7F.."
01754     ".3G9..FDC...4..."
01755     "16..AF4..C.7..58"
01756     "G....1..A.B8..F9"
01757     ".7C.3..8...F6..."
01758     "A8.F.G.C43..2..."
01759     "...7..9E3.D.8.4F"
01760     "...8G...9..5.6C."
01761     "59..F3.4..C....G"
01762     "4F..6.D..B7A..2E"
01763     "...D...BE9..G86."
01764     "..2G..3......BE5"
01765     "..E48.6A..2C...."
01766     "3.8.E5.F..AD...4"
01767     ,
01768 
01769     // http://janko.at/Raetsel/Sudoku/514.a.htm
01770     // 67
01771     "...B562E.1G....."
01772     ".D27A...4...56B."
01773     ".G6..B.C..2..E7."
01774     ".1.C..7.DB..3.42"
01775     "....37.2E..G..64"
01776     "D.3..5..C.A8.G.1"
01777     "C..A...F9...D..3"
01778     ".2.FDG8..3.4.5.E"
01779     "2.8.F.4..CEBG.5."
01780     "E..D...G5...C..B"
01781     "1.5.2C.D..9..F.8"
01782     "FC..E..5G.81...."
01783     "A3.5..G8.9..6.E."
01784     ".F4..A..2.1..39."
01785     ".E16...3...C42G."
01786     ".....E1.763AF..."
01787     ,
01788 
01789     // http://janko.at/Raetsel/Sudoku/515.a.htm
01790     // 68
01791     "A.5.FB.C...7..3."
01792     "G38....D.C.EB5.."
01793     "..F...3.9G8..D7."
01794     "...E.2.4.A.59.FG"
01795     "8..A..6.3F7D5..."
01796     "B..4....5...DEA."
01797     "61..BD75..E....."
01798     ".5C.1E.A.8....62"
01799     "C8....E.7.62.GD."
01800     ".....A..D95F..84"
01801     ".D41...6....2..7"
01802     "...928D1.E..3..C"
01803     "57.3E.A.8.9.C..."
01804     ".21..C58.4...F.."
01805     "..6C9.1.2....AEB"
01806     ".A..D...G.1C.4.5"
01807     ,
01808 
01809     // http://janko.at/Raetsel/Sudoku/516.a.htm
01810     // 69
01811     "...E9.5..6.G...F"
01812     ".6.4.3.G...7.1.B"
01813     ".37A.E..49.5C..."
01814     "9....C76.32E.548"
01815     ".E...4..DG9.2..."
01816     ".4...562C...G8.."
01817     ".G93..1B5F.2.C.7"
01818     "C1.639.A.......5"
01819     "D.......2.496.8G"
01820     "6.3.F.9EG5..B2C."
01821     "..AB...86EC...3."
01822     "...9.2C1..B...D."
01823     "7A1.462.3B5....D"
01824     "...D5.89..G.1BA."
01825     "E.5.G...9.6.F.2."
01826     "4...B.E..D.87..."
01827     ,
01828 
01829     // http://janko.at/Raetsel/Sudoku/517.a.htm
01830     // 70
01831     ".FE6.A.8......1."
01832     "145..7.E..F...68"
01833     "...C.4..EG82..5F"
01834     "....5FD.7B1..C.4"
01835     "..4.82A.C..1B..."
01836     ".8C7..5....AD24G"
01837     "..1F..9.G83BA..."
01838     "..A9F.E6D.....71"
01839     "F9.....53C.718.."
01840     "...321CD.6..74.."
01841     "A1726....4..GFC."
01842     "...49..F.1A8.E.."
01843     "D.F..62B.593...."
01844     "4B..D83A..2.5..."
01845     "87...5..B.4..936"
01846     ".6......8.7.CBD."
01847     ,
01848 
01849     // http://janko.at/Raetsel/Sudoku/518.a.htm
01850     // 71
01851     "...84......D.1F7"
01852     ".6.C..A.4G.....9"
01853     "..945.G.8.F..3A."
01854     "...7CFD2.3...E.G"
01855     "..6B..58..G....."
01856     "8.7..G.C9.4A1..E"
01857     "C..EA3.9...5.GD."
01858     ".F...2.....B3.8A"
01859     "AB.6F.....C...9."
01860     ".7E.B...5.16G..3"
01861     "1..G79.3A.D..C.5"
01862     ".....1..7E..AB.."
01863     "3.4...8.E792B..."
01864     ".E8..D.B.A.359.."
01865     "5.....1A.D..E.3."
01866     "69D.2......C7..."
01867     ,
01868 
01869     // http://janko.at/Raetsel/Sudoku/519.a.htm
01870     // 72// problems
01871     "CD.E9.8......6.."
01872     ".62..3...E..85.7"
01873     ".G...6...AF5...D"
01874     "....D54.39.8...E"
01875     "6FB..ED4...G.1.."
01876     "4.A.5..2D......G"
01877     ".C.1...GF53A2..6"
01878     ".2.3.A.1....F..."
01879     "...2....4.B.9.6."
01880     "3..6G8E95...4.2."
01881     "G......D9..3.F.8"
01882     "..4.2...68A..GC3"
01883     "A...1.3E.D9C...."
01884     "E...49C...5...1."
01885     "2.9D..A...8..3F."
01886     "..8......2.7A.E5"
01887     ,
01888 
01889     // http://janko.at/Raetsel/Sudoku/520.a.htm
01890     // 73
01891     "D..6..1.2C3....8"
01892     "..1..386..5..9.."
01893     ".8C2......DGBF1."
01894     "..5.G......1.A.D"
01895     "..A876..4..C5..."
01896     "64F...AD.2.5..C."
01897     "E....1B9.6A...24"
01898     "B...4....8G...7."
01899     ".7...BD....6...9"
01900     "FG...C9.1D4....A"
01901     ".5..E.6.G7...1DC"
01902     "...BF..G..2A37.."
01903     "5.8.6......D.3.."
01904     ".E2D5A......7CF."
01905     "..7..9..A51..4.."
01906     "9....DC1.4..E..5"
01907     ,
01908 
01909     // http://janko.at/Raetsel/Sudoku/586.a.htm
01910     // 74
01911     "8D...6E...A2...."
01912     "E9.6....4..D.537"
01913     "..539C.2..7.A4.."
01914     "..B2G..5......6D"
01915     ".F....G9CB84...."
01916     "21.D.F5..7.EB.G6"
01917     "983..47.65...A.2"
01918     ".7.C6....A..3954"
01919     "C698..1....54.7."
01920     "F.A...46.82..D9G"
01921     "42.5B.C..3G.6.8F"
01922     "....5E28F9....A."
01923     "7B......G..1C3.."
01924     "..F4.5..B.3AG6.."
01925     "35E.C..A....7.49"
01926     "....D1...FC...25"
01927     ,
01928 
01929     // http://janko.at/Raetsel/Sudoku/587.a.htm
01930     // 75
01931     "6D.5F.B83..7...."
01932     ".F.761...854.A.."
01933     "39.8.D..B..EF.6."
01934     "..E.3.956F...CB1"
01935     "F65......GBA...2"
01936     "...3.6C7D9...8.B"
01937     "..DE..82F.7...5."
01938     "B.7.DF....3.619."
01939     ".A9B.5....81.F.6"
01940     ".3...E.BG5..12.."
01941     "C.G...DF7B9.A..."
01942     "5...1C6......B84"
01943     "7E6...F91A.B.3.."
01944     ".5.9A..D..6.B.2E"
01945     "..A.BG5...F97.1."
01946     "....2..65E.8C.AF"
01947     ,
01948 
01949     // http://janko.at/Raetsel/Sudoku/588.a.htm
01950     // 76
01951     "F.....8.43..BGD6"
01952     "6E..G29....C3.7."
01953     "2.1..D7.5.E..C.."
01954     "89.4...C7.612..."
01955     ".1.F..DAEB5...8."
01956     "..6AF34...D..E1."
01957     "E...B..5..8G.493"
01958     "7.892....4.3D..."
01959     "...1E.A....F63.C"
01960     "D6E.89..G..5...1"
01961     ".G3..F...91E78.."
01962     ".F...1GB36..E.A."
01963     "...87G.6C...4.FA"
01964     "..7..8.1.FB..6.2"
01965     ".D.GA....134..CE"
01966     "C2A6..F3.5.....D"
01967     ,
01968 
01969     // http://janko.at/Raetsel/Sudoku/589.a.htm
01970     // 77
01971     "...439.27..5..G."
01972     "5C67...A93...2D."
01973     ".3B...1D...2.78."
01974     "...2.G7.8EA.3.5F"
01975     "E.C.A23....D...7"
01976     "...D.B..G7F81..6"
01977     ".G.1.68.2A.ECD.."
01978     "F8.6.4G......AE5"
01979     "643......DB.F.2E"
01980     "..586.4C.F2.D.B."
01981     "B..F8A2G..3.7..."
01982     "7...E....894.C.A"
01983     "D7.3.1B4.CE.9..."
01984     ".F4.9...B2...6C."
01985     ".BG...67D...4E13"
01986     ".6..F..31.4AB..."
01987     ,
01988 
01989     // http://janko.at/Raetsel/Sudoku/590.a.htm
01990     // 78
01991     ".1B.....2.59F.6G"
01992     "G.2341A...BF...."
01993     "C.E8....3..D.24."
01994     "F....9E..1...B38"
01995     "..1.F45.6.3.2..9"
01996     "3..E.8C.5D..1..."
01997     "....DB..A8...FE3"
01998     ".4.93.1.E..G.8D."
01999     ".GF.C..7.5.69.8."
02000     "BDC...F1..A8...."
02001     "...5..94.21.G..C"
02002     "E..1.5.8.FC3.D.."
02003     "1B4...8..92....6"
02004     ".A8.9..C....45.B"
02005     "....12...6853A.F"
02006     "5C.27A.B.....91."
02007     ,
02008 
02009     // http://janko.at/Raetsel/Sudoku/591.a.htm
02010     // 79
02011     "A57...8E4......9"
02012     ".4C85.6....9.E3B"
02013     ".E1...3G657..AC8"
02014     "...F.1.9.8EA5.7."
02015     ".8.5.7...4F...2."
02016     "..9316....BG8..."
02017     "..E2A..4.....D97"
02018     "F.4....856..G1.3"
02019     "6.84..ECB....F.5"
02020     "5FA.....C..637.."
02021     "...7F4....1528.."
02022     ".2...35...8.C.1."
02023     ".9.13E2.8.4.A..."
02024     "BD2..G4FAC...98."
02025     "8G5.C....D.EF3B."
02026     "4......57B...2G6"
02027     ,
02028 
02029     // http://janko.at/Raetsel/Sudoku/592.a.htm
02030     // 80
02031     "..8.A.F.B97.1.6."
02032     "1B79...6.....8E."
02033     "..E3..928...D.5."
02034     "26..8.B....17..."
02035     "91..6A2..B3..D.."
02036     ".F..37.52.GD.4.."
02037     "3.679...5.EF...A"
02038     "4.B..FC..16...G5"
02039     "73...8A..5D..F.1"
02040     "5...FC.3...98G.E"
02041     "..F.D5.13.A8..B."
02042     "..A..B6..2FG..7D"
02043     "...6B....E.2..1C"
02044     ".4.F...A1D..GE.."
02045     ".A2.....G...4638"
02046     ".7.G.28F.6.3.A.."
02047     ,
02048 
02049     // http://janko.at/Raetsel/Sudoku/593.a.htm
02050     // 81
02051     ".2ED.4...C...F.."
02052     ".8.FE.6.1.....A4"
02053     "A..7.8F.29.B...C"
02054     "....3GCB...5.87D"
02055     "..45DA..B7F3C.6."
02056     "....G...4..CA2.5"
02057     "2.7.F..CG...34B."
02058     ".ED.B54381..G..."
02059     "...4..825GBE.3F."
02060     ".B5G...63..F.C.1"
02061     "1.F27..E...4...."
02062     ".D.84FG5..167B.."
02063     "3C1.2...DB8G...."
02064     "D...6.59.F3.8..2"
02065     "4G.....F.A.71.C."
02066     "..8...B...9.ED3."
02067     ,
02068 
02069     // http://janko.at/Raetsel/Sudoku/594.a.htm
02070     // 82
02071     "5....E...7B..CF2"
02072     "AF.467....3...D."
02073     "D.E.C.3....8.7.."
02074     "....8..DA6.E..5."
02075     "..3B....4.A.EF1."
02076     "69..B.D.3.....C7"
02077     "1..G...49.C..6.."
02078     "...D12G5FE..B..."
02079     "...7..93285AF..."
02080     "..8..4.76...2..G"
02081     "96.....F.3.B..84"
02082     ".AB3.G.6....95.."
02083     ".1..F.69E..2...."
02084     "..9.G....F.3.2.E"
02085     ".E...D....95G.BF"
02086     "2G7..C5...4....3"
02087     ,
02088 
02089     // http://janko.at/Raetsel/Sudoku/595.a.htm
02090     // 83
02091     ".3.B8..C61...2.."
02092     ".E.2...F..4.1A67"
02093     "71D...A...C..B.."
02094     ".6...92D.B.3..45"
02095     "...8A...C.F4...3"
02096     ".F9.75E4..B.6..."
02097     "5..1...8..6.4F.."
02098     "4...C....EA.B.2G"
02099     "2D.7.E5....6...1"
02100     "..BA.D..9...G..8"
02101     "...E.1..G2DF.59."
02102     "6...4C.B...73..."
02103     "A2..B.C.46E...7."
02104     "..1..2...9...8AD"
02105     "DC75.A..3...E.B."
02106     "..8...GEA..C2.5."
02107     ,
02108 
02109     // http://janko.at/Raetsel/Sudoku/596.a.htm
02110     // 84
02111     "B62...9...1...G7"
02112     "C.....7.6..A.1.9"
02113     ".1....A8..7.2..3"
02114     "..A831.CG2..E..."
02115     ".8..92.A..GD4..."
02116     "G.C.D8..F.529..."
02117     "...4.........D6A"
02118     ".5.B.C.17..3G8.."
02119     "..E12..9D.B.6.8."
02120     "9C7.........5..."
02121     "...A54.7..2C.F.G"
02122     "...FCD..4.A5..9."
02123     "...9..1E2.F83C.."
02124     "1..7.9..A3....D."
02125     "2.3.8..B.5.....6"
02126     "EB...3...7...G12"
02127     ,
02128 
02129     // http://janko.at/Raetsel/Sudoku/597.a.htm
02130     // 85
02131     "..6..1..4..F3.A."
02132     "7E..6G.3....FC.."
02133     "BC3..FD.6.9.G..2"
02134     ".....4E.CG3.B..."
02135     "1.E..C.....2.A.."
02136     "...AE6...4F..9.3"
02137     ".8.2..3F.C.1...."
02138     "34..8...B57..EC."
02139     ".B9..3CD...8..E5"
02140     "....9.F.GA..4.1."
02141     "A.4..E2...6BC..."
02142     "..8.A.....E..7.B"
02143     "...C.2A6.EB....."
02144     "E..8.9.5.3C..62G"
02145     "..B9....2.GD..5C"
02146     ".3.5C..E..1..4.."
02147     ,
02148 
02149     // http://janko.at/Raetsel/Sudoku/598.a.htm
02150     // 86
02151     ".FA..5...B7..E.6"
02152     "18....4B...C..G."
02153     "..G.7..CF....8.5"
02154     ".B9CG8.........."
02155     ".D..A.G..85....E"
02156     "69..3...1...C5.."
02157     "7.4B....G.A.2..F"
02158     "..8.5B6D..27...."
02159     "....8G..EC61.D.."
02160     "3..6.C.7....91.8"
02161     "..DF...5...9..73"
02162     "8....6B..2.5..E."
02163     "..........14EFD."
02164     "9.6....AD..F.7.."
02165     ".E..6...29....1C"
02166     "G.2..EF...C..4B."
02167     ,
02168 
02169     // http://janko.at/Raetsel/Sudoku/599.a.htm
02170     // 87
02171     ".3..6GF..C8....."
02172     "G..9.B.8...5.A74"
02173     "7..8.2..B..D...."
02174     ".EA.....3.6..9B."
02175     "..F.2....3AG...."
02176     "E7...........39G"
02177     ".9.A..31E6..FC.."
02178     "4.3..D.9C.B....E"
02179     "6....8.4A.2..G.C"
02180     "..G3..CFD9..4.A."
02181     "A85...........FB"
02182     "....5A7....6.2.."
02183     ".24..7.D.....16."
02184     "....1..3..C.2..8"
02185     "1A7.C...6.3.E..9"
02186     ".....6E..1F2..3."
02187     ,
02188 
02189     // http://janko.at/Raetsel/Sudoku/600.a.htm
02190     // 88
02191     "....47.....9B.1."
02192     "..5..9F2.6....43"
02193     "B..3.....E24..9."
02194     "..9.....A57..2.."
02195     ".DA4E..7...C.F.."
02196     ".1.6..4.E....8.B"
02197     "....81BF..4.5..7"
02198     "...F9A....D..E.4"
02199     "5.2..3....A71..."
02200     "6..C.B..G9FE...."
02201     "7.8....9.D..C.3."
02202     "..G.6...1..3E45."
02203     "..F..E8D.....A.."
02204     ".2..741.....3..8"
02205     "D6....5.92B..1.."
02206     ".A.EB.....C6....",
02207     // 89
02208     //".N..JG..O7591...8I....L.."
02209     "BNDAJG62O7591KHF8IP34CLME"
02210     "FG.M.B8...P.E...CJ..H...."
02211     "...........G.4.H.D.O.NJA2"
02212     ".....J.EN4.L6MA.B.2......"
02213     "HE..2..DC.....F4KMA.B.9O8"
02214     "M....62...47C19......E5.."
02215     ".I2.8M.JGL...ADN..K..3.F7"
02216     "..H3.5..89....I.J.....NL."
02217     "1B..9.FAP.6.N....537.H..O"
02218     "......1..N...O...LC.68.PG"
02219     "KOA.FNBH.....7.C.....M..6"
02220     "45.ECP.I..N.F.J1...MK.79."
02221     "I.L..8.O..9.P...A...2.1J."
02222     "..621.D.M.....B8LG..P..CH"
02223     ".HP.N7E.L1....3..B..O.G45"
02224     "....BIO....5.C.P...FN48E."
02225     "...FL.....2.DH..17..59O.."
02226     "..I.MF..2G.N...A6O.HC.PB."
02227     "72.1..L...IM.96E.45G....."
02228     "..9...7M..A.O...I...L...."
02229     ".C.JA.........1.....E.48."
02230     "O.BI.......PHL.6..1....5C"
02231     "G6M...N4FI8...K..H.E....."
02232     ".L..4.917....BE.G8F.M.I.."
02233     "8F......5.O3..4...9.....K",
02234     // 90
02235     //".N..JG..O7591...8I....L.."
02236     ".ND.JG6.O7591..F8IP.4.LM."
02237     "FG.M.B8...P.E...CJ..H...."
02238     "...........G.4.H.D.O.NJA2"
02239     ".....J.EN4.L6MA.B.2......"
02240     "HE..2..DC.....F4KMA.B.9O8"
02241     "M....62...47C19......E5.."
02242     ".I2.8M.JGL...ADN..K..3.F7"
02243     "..H3.5..89....I.J.....NL."
02244     "1B..9.FAP.6.N....537.H..O"
02245     "......1..N...O...LC.68.PG"
02246     "KOA.FNBH.....7.C.....M..6"
02247     "45.ECP.I..N.F.J1...MK.79."
02248     "I.L..8.O..9.P...A...2.1J."
02249     "..621.D.M.....B8LG..P..CH"
02250     ".HP.N7E.L1....3..B..O.G45"
02251     "....BIO....5.C.P...FN48E."
02252     "...FL.....2.DH..17..59O.."
02253     "..I.MF..2G.N...A6O.HC.PB."
02254     "72.1..L...IM.96E.45G....."
02255     "..9...7M..A.O...I...L...."
02256     ".C.JA.........1.....E.48."
02257     "O.BI.......PHL.6..1....5C"
02258     "G6M...N4FI8...K..H.E....."
02259     ".L..4.917....BE.G8F.M.I.."
02260     "8F......5.O3..4...9.....K"
02261   };
02262 
02264   const unsigned int n_examples = sizeof(examples)/sizeof(char*);
02265 
02267   int example_size(const char *s) {
02268     int l = std::strlen(s);
02269     int res = static_cast<int>(std::sqrt(std::sqrt(static_cast<float>(l))));
02270     assert(res*res*res*res == l);
02271     return res;
02272   }
02273 
02275   int sudokuField(const char *s, int n, int i, int j) {
02276     assert(example_size(s) == std::sqrt(static_cast<float>(n)));
02277     assert(i >= 0 && i < n);
02278     assert(j >= 0 && j < n);
02279     char c = s[j*n + i];
02280     if (!std::isalnum(c))
02281       return 0;
02282     if (std::isdigit(c))
02283       return c - '0';
02284     if (std::islower(c))
02285       c = static_cast<char>(std::toupper(c));
02286     // std::alpha(c) == true && std::isupper(c)
02287     int res = (c - 'A') + 10;
02288     if (res > n) return 0;
02289     else return res;
02290   }
02292 }
02293 
02294 // STATISTICS: example-any