huashi3483 发表于 2008-2-16 00:54

数学中国2008年美赛B题:sudoku source code

<div class="ad_notxt"><div id="1323226810_1"><pre class="code"><font color="#ff0000" size="6"><strong>c++</strong></font></pre><pre class="code">/*PROGRAM FOR SOLVING THE <strong class="highlight">SUDOKU</strong> USING 'C'*/<br/><br/>#include&lt;stdio.h&gt;<br/>#include&lt;conio.h&gt;<br/>#include&lt;iostream.h&gt;<br/>#include&lt;stdlib.h&gt;<br/><br/>int i,j,k,a,o,x,y;<br/><br/>void display();<br/>int getnum();<br/>void solve(int [],int [],int);<br/>int check(int ,int );<br/><br/>void main()<br/>{<br/> clrscr();<br/> printf("\n\nEnter the elements of <strong class="highlight">SUDOKU</strong> in rowwise.\n[ Enter '0' if element is absent. ]");<br/> for(i=1;i&lt;=9;i++)<br/> for(j=1;j&lt;=9;j++)<br/>  scanf("%d",&amp;a);<br/> printf("\n\nEntered SUDOKU\n\n");<br/> display();<br/> printf("\nEnter any key for solution....\n");<br/> getch();<br/> o=getnum();<br/> solve(x,y,1);<br/> }<br/><br/>  int getnum()<br/>  {<br/>   int c=0;<br/>   for(i=1;i&lt;=9;i++)<br/>   {<br/>   for(j=1;j&lt;=9;j++)<br/>   {<br/>    if(a==0)<br/>    {<br/>     c++;<br/>     x=i;<br/>     y=j;<br/>     }<br/>    }<br/>   }<br/>   return(c);<br/>  }<br/><br/>  void display()<br/>  {<br/>   for(i=1;i&lt;=9;i++)<br/>   {<br/>    for(j=1;j&lt;=9;j++)<br/>    {<br/>     if(a!=0)<br/>      printf("  %d",a);<br/>     else<br/>      printf("  ");<br/>     }<br/>     printf("\n\n");<br/>    }<br/>   }<br/><br/><br/>   void solve(int p,int q,int n)<br/>   {<br/>    for(k=1;k&lt;=9;k++)<br/>    for(i=p;i&lt;=p;i++)<br/>    for(j=q;j&lt;=q;j++)<br/>    {<br/>     a=k;<br/>     if(n&lt;0)<br/>      solve(p,q,n++);<br/>     int ch=check(1,0);<br/>     if(ch!=0)<br/>     {<br/>      display();<br/>      getch();<br/>      exit(0);<br/>      }<br/>     }<br/>    }<br/>   }<br/><br/>   int check(int n,int r)<br/>   {<br/>    int f=0,cont=0;<br/>    if(r==1)<br/>    {<br/>     for(k=1;k&lt;=9;k++)<br/>     {<br/>      for(i=n;i&lt;=n;i++)<br/>      for(j=1;j&lt;=9;j++)<br/>      {<br/>       if(k==a)<br/> f++;<br/>       }<br/>       if(f!=1)<br/> return(0);<br/>       else<br/> cont++;<br/>       f=0;<br/> }<br/> if(cont!=9)<br/>  return(0);<br/> else if(n==9)<br/>  check(1,0);<br/> else<br/>  check(n++,1);<br/> }<br/> else<br/> {<br/>  for(k=1;k&lt;=9;k++)<br/>  {<br/>   for(i=1;i&lt;=9;i++)<br/>   for(j=n;j&lt;=n;j++)<br/>   {<br/>    if(k==a)<br/>     f++;<br/>    }<br/>    if(f!=1)<br/>     return(0);<br/>    else<br/>     cont++;<br/>                   f=0;<br/>    }<br/>    if(cont!=9)<br/>     return(0);<br/>    else if(n!=9)<br/>     check(n++,1);<br/>     }<br/>    }</pre></div><div id="1323226810_2" style="DISPLAY: none;"></div></div>
[此贴子已经被作者于2008-2-16 1:12:52编辑过]

huashi3483 发表于 2008-2-16 00:59

<p><font color="#ff0000"><strong> Java code</strong></font></p><p>http://blogs.msdn.com/dotnetinterop/archive/2006/02/15/re-use-of-existing-java-code-sudoku-engine.aspx</p>

huashi3483 发表于 2008-2-16 00:59

<p><strong><font color="#ff0000" size="6">c#</font></strong></p><p><a href="http://www.codeproject.com/KB/game/sudokuincsharp.aspx">http://www.codeproject.com/KB/game/sudokuincsharp.aspx</a></p><p><a href="http://www.codeproject.com/KB/smart/SudokuSmartClient.aspx">http://www.codeproject.com/KB/smart/SudokuSmartClient.aspx</a></p>
[此贴子已经被作者于2008-2-16 1:05:53编辑过]

huashi3483 发表于 2008-2-16 01:02

<p>Formula<span style="FONT-SIZE: 36pt; COLOR: red;">O</span>ne Compiler </p><p>http://www.f1compiler.com/samples/Sudoku.f1.html</p>

huashi3483 发表于 2008-2-16 01:13

<p>Python scripts</p><p>http://www.eddaardvark.co.uk/sudoku/sudokusource.html</p>

enewsky 发表于 2008-2-16 09:43

1

<p>#include &lt;iostream&gt; <br/>#include &lt;ctime&gt; <br/>#include &lt;vector&gt; <br/>using namespace std; </p><p>/**********初始9?的矩阵*************/ <br/>/******元素为0,说明该位置还未填充***/ <br/>int  MATRIX={ {0,0,0,0,0,0,0,0,0}, <br/>                    {0,0,0,0,0,0,0,0,0}, <br/>                    {0,0,0,0,0,0,0,0,0}, <br/>                    {0,0,0,0,0,0,0,0,0}, <br/>                    {0,0,0,0,0,0,0,0,0}, <br/>                    {0,0,0,0,0,0,0,0,0}, <br/>                    {0,0,0,0,0,0,0,0,0}, <br/>                    {0,0,0,0,0,0,0,0,0}, <br/>                    {0,0,0,0,0,0,0,0,0}  }; </p><p>/*******初始给出的元素个数***********/ <br/>int INITIAL_COUNT; </p><p>/********已填充元素个数,作为填充结束标志**********/ <br/>int  FINISH_COUNT=0; </p><p>/********各个元素的初始候选集合*******/ </p><p>vector&lt;vector&lt;int&gt; &gt; IVEC(81); </p><p><br/>/**************函数原型******************/ </p><p>/*********得到初始给出的元素个数*******/ <br/>int get_initialcount(); </p><p>/*******初始化候选集合***************/ <br/>void initial_candidate(); <br/>/***********从vector中删除指定元素*******/ <br/>void  delete_value(vector&lt;int&gt; &amp;ivec,int value); </p><p>/********更新候选集合**************/ <br/>void refresh_candidate(); </p><p>/*********返回9?候选集合元素最少的候选集合序号*******/ <br/>int  min_seq(); </p><p><br/>/********随机生成一个位置序号并取得该序号所对应的元素值******/ <br/>int  choose_seq(int min_seq); </p><p>/*******填充该元素并判断是否填充完毕********/ <br/>int  is_finish(int min_seq, int choose_value); </p><p><br/>int main() <br/>{ <br/> /******得到初始给出的元素个数*****/ <br/> INITIAL_COUNT=get_initialcount(); <br/> /******初始化候选集合*******/ <br/>  initial_candidate(); <br/>  /********先更新候选集合(为了应付已经填充一部分数的情况)******/ <br/>  refresh_candidate(); <br/>  int i; <br/>  int MinSeq; <br/>  int ChooseValue; <br/>  MinSeq=min_seq(); <br/>  ChooseValue=choose_seq(MinSeq); <br/> while(is_finish(MinSeq,ChooseValue)!=1) <br/>  { <br/>      refresh_candidate(); <br/> MinSeq=min_seq(); <br/> ChooseValue=choose_seq(MinSeq); <br/>  } <br/>  /**********输出填好的数独游戏结果*********/ <br/> for( i=0;i&lt;9;++i) <br/>  { <br/>    for(int j=0;j&lt;9;++j) <br/>    { <br/>       cout&lt;&lt;MATRIX&lt;&lt;'\t'; <br/>    } <br/>    cout&lt;&lt;endl; <br/>  } <br/>  return 0; <br/>} </p><p>/*******************函数定义***********************/ </p><p>/*********得到初始给出的元素个数*******/ <br/>int get_initialcount() <br/>{ <br/>int count=0; <br/>for(int i=0;i&lt;9;++i) <br/>{ <br/>for(int j=0;j&lt;9;++j) <br/>{ <br/>if(MATRIX!=0) <br/>{ <br/>count++; <br/>} <br/>} <br/>} <br/>return count; <br/>} </p><p><br/>/*******初始化候选集合***************/ <br/>void initial_candidate() <br/>{ <br/>   for(int i=0;i&lt;81;++i) <br/>   { <br/>      for(int j=1;j&lt;10;++j) <br/>      { <br/>          IVEC.push_back(j); <br/>      } <br/>   } <br/> } </p><p>/***********从vector中删除指定元素*******/ <br/>void  delete_value(vector&lt;int&gt; &amp;ivec,int value) <br/>{ <br/>/*******如果ivec已经为空,直接退出**********/ <br/>if (ivec.size()==0) <br/>{ <br/>return; <br/>} <br/>   vector&lt;int&gt;::iterator iter=ivec.begin(); <br/>   while( iter&lt;ivec.end() &amp;&amp; (*iter)!=value ) <br/>   { <br/>      iter++; <br/>   } <br/>   if(iter&lt;ivec.end())//在vector中找到已填充的元素,把它删除 <br/>   { <br/>      ivec.erase(iter); <br/>   } <br/> } </p><p><br/>/********更新候选集合**************/ <br/>void refresh_candidate() <br/>{ <br/>   int i; <br/>   int rownum,colnum; <br/>   int row,col;   <br/>   /******更新81个vector*******/ <br/>   for(i=0;i&lt;81;++i) <br/>   { <br/>  row=i/9; <br/>       col=i%9; <br/>  if(MATRIX!=0)//该位置已经填充 <br/>  { <br/>  if(IVEC.size()!=0)//该vector不空 <br/>  { <br/> /********删除整个候选集***********/ <br/> IVEC.erase(IVEC.begin(),IVEC.end()); <br/> } <br/>  } <br/>  else <br/>  { <br/>  /*****删除同一行中的元素****/ <br/>           for(colnum=0;colnum&lt;9;++colnum) <br/>  { <br/>  delete_value(IVEC,MATRIX); <br/>  } <br/>  /*****删除同一列中的元素****/ <br/>           for(rownum=0;rownum&lt;9;++rownum) <br/>  { <br/>  delete_value(IVEC,MATRIX); <br/>  } <br/>  /*****删除在一个3?方阵中的元素******/ </p><p>  /******在第1块中,删除3?方阵元素*****/ <br/>  if(row/3==0 &amp;&amp; col/3==0) <br/>  { <br/> for(int r=0;r&lt;3;++r) <br/> { <br/> for(int c=0;c&lt;3;++c) <br/> { <br/> delete_value(IVEC,MATRIX); <br/> } <br/> } <br/>  } </p><p>   /******在第2块中,删除3?方阵元素*****/ <br/>  if(row/3==0 &amp;&amp; col/3==1) <br/>  { <br/> for(int r=0;r&lt;3;++r) <br/> { <br/> for(int c=3;c&lt;6;++c) <br/> { <br/> delete_value(IVEC,MATRIX); <br/> } <br/> } <br/>  } </p><p>   /******在第3块中,删除3?方阵元素*****/ <br/>  if(row/3==0 &amp;&amp; col/3==2) <br/>  { <br/> for(int r=0;r&lt;3;++r) <br/> { <br/> for(int c=6;c&lt;9;++c) <br/> { <br/> delete_value(IVEC,MATRIX); <br/> } <br/> } <br/>  } </p><p>   /******在第4块中,删除3?方阵元素*****/ <br/>  if(row/3==1 &amp;&amp; col/3==0) <br/>  { <br/> for(int r=3;r&lt;6;++r) <br/> { <br/> for(int c=0;c&lt;3;++c) <br/> { <br/> delete_value(IVEC,MATRIX); <br/> } <br/> } <br/>  } </p><p>   /******在第5块中,删除3?方阵元素*****/ <br/>  if(row/3==1 &amp;&amp; col/3==1) <br/>  { <br/> for(int r=3;r&lt;6;++r) <br/> { <br/> for(int c=3;c&lt;6;++c) <br/> { <br/> delete_value(IVEC,MATRIX); <br/> } <br/> } <br/>  } </p><p>   /******在第6块中,删除3?方阵元素*****/ <br/>  if(row/3==1 &amp;&amp; col/3==2) <br/>  { <br/> for(int r=3;r&lt;6;++r) <br/> { <br/> for(int c=6;c&lt;9;++c) <br/> { <br/> delete_value(IVEC,MATRIX); <br/> } <br/> } <br/>  } </p><p>   /******在第7块中,删除3?方阵元素*****/ <br/>  if(row/3==2 &amp;&amp; col/3==0) <br/>  { <br/> for(int r=6;r&lt;9;++r) <br/> { <br/> for(int c=0;c&lt;3;++c) <br/> { <br/> delete_value(IVEC,MATRIX); <br/> } <br/> } <br/>  } </p><p>   /******在第8块中,删除3?方阵元素*****/ <br/>  if(row/3==2 &amp;&amp; col/3==1) <br/>  { <br/> for(int r=6;r&lt;9;++r) <br/> { <br/> for(int c=3;c&lt;6;++c) <br/> { <br/> delete_value(IVEC,MATRIX); <br/> } <br/> } <br/>  } </p><p>   /******在第9块中,删除3?方阵元素*****/ <br/>  if(row/3==2 &amp;&amp; col/3==2) <br/>  { <br/> for(int r=6;r&lt;9;++r) <br/> { <br/> for(int c=6;c&lt;9;++c) <br/> { <br/> delete_value(IVEC,MATRIX); <br/> } <br/> } <br/>  } </p><p>  } <br/>   } <br/>} </p><p>/*********返回9?候选集合元素最少的候选集合序号*******/ <br/>int  min_seq() <br/>{ <br/>   int count; <br/>   int i; <br/>   for(i=0;i&lt;81;++i) <br/>   { <br/>     count=IVEC.size(); </p><p>   } <br/>   int  value=10; <br/>   int  min_seq; <br/>   for(i=0;i&lt;81;++i) <br/>   { <br/>     if(count==0) <br/>     { <br/>        continue; <br/>     } <br/>     if(count&lt;value) <br/>     { <br/>        value=count; <br/>        min_seq=i; <br/>     } <br/>   } <br/>   return min_seq; <br/>} </p><p>/********随机生成一个位置序号并取得该序号所对应的元素值******/ <br/>int  choose_seq(int min_seq) <br/>{ <br/>   /*****根据当前时间设置种子******/ <br/>   srand((unsigned)time( NULL )); <br/>   int random_seq=rand()%(IVEC.size()); <br/>   return  IVEC; <br/>} </p><p>/*******填充该元素并判断是否填充完毕********/ <br/>int  is_finish(int min_seq, int choose_value) <br/>{ <br/>   int  row, column; <br/>   row=min_seq/9; <br/>   column=min_seq%9; <br/>   MATRIX=choose_value; <br/>   FINISH_COUNT++; /****已填充元素个数加1*****/ <br/>   /*******填充完毕判断********/ <br/>   if(FINISH_COUNT==81-INITIAL_COUNT) <br/>   { <br/>      return  1; <br/>   } <br/>   else <br/>   { <br/>      return  0; <br/>   } <br/>} </p>

yongzlee 发表于 2008-2-16 11:29

<p>贴这些东西有意思吗?</p><p></p>

iori1986iori 发表于 2008-2-23 11:31

<font color="#000000">貌似和我发的帖子一样哈</font>

szj2008 发表于 2009-1-24 13:32

貌似和我发的帖子一样

bsfslxh 发表于 2009-1-30 08:57

谢谢~~~~~~~
页: [1] 2
查看完整版本: 数学中国2008年美赛B题:sudoku source code