<?xml version="1.0" encoding="UTF-8" standalone="yes"?><oembed><version><![CDATA[1.0]]></version><provider_name><![CDATA[The Osmosian Order of Plain English Programmers Welcomes You]]></provider_name><provider_url><![CDATA[http://osmosianplainenglishprogramming.blog]]></provider_url><author_name><![CDATA[gerryrzeppa]]></author_name><author_url><![CDATA[https://osmosianplainenglishprogramming.blog/author/gerryrzeppa/]]></author_url><title><![CDATA[Sudoku Solver]]></title><type><![CDATA[link]]></type><html><![CDATA[<header class="entry-header">
<h1 class="entry-title"></h1>
</header>
<div class="entry-content">
<p>This is a Sudoku puzzle:</p>
<p><img loading="lazy" class="alignnone size-large wp-image-328332" src="https://cdncontribute.geeksforgeeks.org/wp-content/uploads/sudoku-unsolved-1-1024x819.jpg" alt="" width="665" height="532" /></p>
<p>The object is to get one, and only one, of each digit in each row, column, and 3-by-3 block.</p>
<p>This is what it looks like after my Plain English program solves it:</p>
<p><img loading="lazy" class="alignnone size-large wp-image-328331" src="https://cdncontribute.geeksforgeeks.org/wp-content/uploads/sudoku-solved-1-1024x819.jpg" alt="" width="665" height="532" /></p>
<p>And this is the Plain English routine that does the deed:</p>
<p><span style="color:#00ccff;">To solve a sudoku puzzle:</span><br />
<span style="color:#00ccff;"> Get a blank cell. If the blank cell is nil, exit.</span><br />
<span style="color:#00ccff;"> Loop.</span><br />
<span style="color:#00ccff;"> Add 1 to a number. If the number is greater than 9, exit.</span><br />
<span style="color:#00ccff;"> If the number is not valid in the blank, repeat.</span><br />
<span style="color:#00ccff;"> Put the number into the blank.</span><br />
<span style="color:#00ccff;"> Solve the puzzle. If the sudoku puzzle is solved, break.</span><br />
<span style="color:#00ccff;"> Erase the blank cell.</span><br />
<span style="color:#00ccff;"> Repeat.</span><br />
<span style="color:#00ccff;"> Display message &#8220;Solved!&#8221;.</span></p>
<p>Technically speaking, it’s a “recursive backtracking” routine. It tries a number in a blank cell, then calls itself to try another number in another blank cell. If everything works out, we’re done. If we get stuck, it works backward, erasing the mistakes and trying again with a different starting number. It’s fun to watch; you just draw the puzzle on the screen right before each recursive call.</p>
<p>I noticed that there are other articles on various sites that use a similar algorithm, and I thought a brief comparison might be instructive and edifying. Below is a C/C++ equivalent of the above Plain English routine that I found:</p>
</div>
<div class="entry-content">
<div>
<div id="highlighter_167890" class="syntaxhighlighter  cpp">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="cpp color1 bold">bool</code><code class="cpp plain">SolveSudoku(</code><code class="cpp color1 bold">int</code><code class="cpp plain">grid[N][N])</code></div>
<div class="line number2 index1 alt1"><code class="cpp plain">{</code></div>
<div class="line number3 index2 alt2"><code class="cpp spaces">    </code><code class="cpp color1 bold">int</code><code class="cpp plain">row, col;</code></div>
<div class="line number4 index3 alt1"></div>
<div class="line number5 index4 alt2"><code class="cpp spaces">    </code><code class="cpp comments">// If there is no unassigned loc, we are done</code></div>
<div class="line number6 index5 alt1"><code class="cpp spaces">    </code><code class="cpp keyword bold">if</code><code class="cpp plain">(!FindUnassignedLocation(grid, row, col))</code></div>
<div class="line number7 index6 alt2"><code class="cpp spaces">       </code><code class="cpp keyword bold">return</code><code class="cpp keyword bold">true</code><code class="cpp plain">; </code><code class="cpp comments">// success!</code></div>
<div class="line number8 index7 alt1"></div>
<div class="line number9 index8 alt2"><code class="cpp spaces">    </code><code class="cpp comments">// consider digits 1 to 9</code></div>
<div class="line number10 index9 alt1"><code class="cpp spaces">    </code><code class="cpp keyword bold">for</code><code class="cpp plain">(</code><code class="cpp color1 bold">int</code><code class="cpp plain">num = 1; num &lt;= 9; num++)</code></div>
<div class="line number11 index10 alt2"><code class="cpp spaces">    </code><code class="cpp plain">{</code></div>
<div class="line number12 index11 alt1"><code class="cpp spaces">        </code><code class="cpp comments">// if looks promising</code></div>
<div class="line number13 index12 alt2"><code class="cpp spaces">        </code><code class="cpp keyword bold">if</code><code class="cpp plain">(isSafe(grid, row, col, num))</code></div>
<div class="line number14 index13 alt1"><code class="cpp spaces">        </code><code class="cpp plain">{</code></div>
<div class="line number15 index14 alt2"><code class="cpp spaces">            </code><code class="cpp comments">// make tentative assignment</code></div>
<div class="line number16 index15 alt1"><code class="cpp spaces">            </code><code class="cpp plain">grid[row][col] = num;</code></div>
<div class="line number17 index16 alt2"></div>
<div class="line number18 index17 alt1"><code class="cpp spaces">            </code><code class="cpp comments">// return, if success, yay!</code></div>
<div class="line number19 index18 alt2"><code class="cpp spaces">            </code><code class="cpp keyword bold">if</code><code class="cpp plain">(SolveSudoku(grid))</code></div>
<div class="line number20 index19 alt1"><code class="cpp spaces">                </code><code class="cpp keyword bold">return</code><code class="cpp keyword bold">true</code><code class="cpp plain">;</code></div>
<div class="line number21 index20 alt2"></div>
<div class="line number22 index21 alt1"><code class="cpp spaces">            </code><code class="cpp comments">// failure, unmake &amp; try again</code></div>
<div class="line number23 index22 alt2"><code class="cpp spaces">            </code><code class="cpp plain">grid[row][col] = UNASSIGNED;</code></div>
<div class="line number24 index23 alt1"><code class="cpp spaces">        </code><code class="cpp plain">}</code></div>
<div class="line number25 index24 alt2"><code class="cpp spaces">    </code><code class="cpp plain">}</code></div>
<div class="line number26 index25 alt1"><code class="cpp spaces">    </code><code class="cpp keyword bold">return</code><code class="cpp keyword bold">false</code><code class="cpp plain">; </code><code class="cpp comments">// this triggers backtracking</code></div>
<div class="line number27 index26 alt2"><code class="cpp plain">}</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p>I showed the two versions to my wife, and she said, “Kind of makes you wonder why some people say that Plain English is too verbose!” So we did some counting:</p>
<p>Lines of code: Plain English, 10; C/C++, 27<br />
(more than double in the C/C++ version)</p>
<p>Characters: Plain English, 334; C/C++, 681<br />
(more than double in the C/C++ version)</p>
<p>Punctuation Marks: Plain English, 19; C/C++, 70<br />
(more than three times as many in the C/C++ version)</p>
<p>Conclusion? Plain English is easier to learn, easier to remember, easier to think about, easier to type, easier to read. And reasonably compact (<em>more </em>compact in some cases, like the one above).</p>
</div>
]]></html><thumbnail_url><![CDATA[https://i2.wp.com/cdncontribute.geeksforgeeks.org/wp-content/uploads/sudoku-unsolved-1-1024x819.jpg?fit=440%2C330&ssl=1]]></thumbnail_url><thumbnail_width><![CDATA[413]]></thumbnail_width><thumbnail_height><![CDATA[330]]></thumbnail_height></oembed>