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