Generated on Mon Jul 6 18:09:01 2009 for Gecode by doxygen 1.5.9

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