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