Generated on Mon Aug 25 11:35:33 2008 for Gecode by doxygen 1.5.6

sudoku.cc

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