八皇后问题

原创 2006年06月15日 14:12:00
// eq.cpp : 定义控制台应用程序的入口点。 // //参考自BAIDU知道,原来是PASCAL写的,而且好像有点问题,见下面C写的 /* 大家一定见过这种办法吧 ,但是做为初学者理解起来特别困难 ,我就把我当时对它的理解简单说一下,不对的地方大家给个 建议! program eightqueens; var x:array[1..8] of integer; a,b,c:array[-7..16] of boolean; i:integer; procedure print; var k:integer; begin for k:=1 to 8 do write(x[k]:4); writeln; end; procedure try(i:integer); var j:integer; begin for j:=1 to 8 do if a[j] and b[i+j] and c[i-j] then begin x:=j; a[j]:=false; b[i+j]:=false; c[i-j]:=false; if i<8 then try(i+1) else print; a[j]:=true; b[i+j]:=true; c[i-j]:=true end end; begin for i:=-7 to 16 do begin a:=true; b:=true; c:=true end; try(1); end. 现在循环从 i=1 ,j:=1 to 8 do 开始 此时 计算机检测到 i=1 j=1 简化为(1,1)为空,占用该位置并令该位置对应的斜线和水平方向的位置为 false ,然后程序就开始去执行try(2),注意此时计算机在i=1 这层仅仅走拉一个循环(j=1)就跳到拉i=2 这层里此时计算机从j:=1 to 8 do 又开始循环,排除 j=1,j=2 得到 (2,3)注意计算机在层里也只是走拉3(j=3)个循环然后又跳到拉i=3 这层依次类推得到(3,5),(4,2)(5,4)而在i=6 这层里计算机从j:= 1 to 8 do 都没有找到合适的位置,此时注意在i=6 这层里计算机计算机将返回到i=5 这层里,(因为用拉递归)并且释放(5,4)该位置,为什么要释放呢?因为原因很简单如果不释放的话 该位置对应的斜线和水平方向会对以后的几层造成影响,让计算机误认为为false.此时的在i=5这层里 j=4才是结束,然后计算机又会从j=5到 8 开始去找合适的位置 ,如果找不到又会返回到上一层依次类推直到计算机找到一组解 输出,假设在(8,3)这个位置是计算机找到的一组解,此时计算机又会从j=4到8 开始循环,如果找不到 计算机就会返回上一层的即i=7这层接着上一次的跳出位置走完以后的循环,依次类推不断的返回,跳出, 求解,(即令前几个位置不变,从第8个位置变换,没有空位置的.接会返回上一层)最后返回到i=1这层里,注意此时在这层里也只是走拉j=1个循环然后计算机就又开始从j= 2 去试着找....大家有没有算过求出所有的解要走过多少个循环?我想估计也不下1000个吧.其实整个过程就是一个重复的过程(即递归)倒着想在i=7 这层里的j=1 位置即(7,1) 计算机会去试从(8,1)到(8,8)这8 个位置,而在(7,2)也同样会去试这8 个位置 等等在(6,1)会试(7,1)到(7,8) 等. 这是正着考虑(1,1)这里计算机会试着从(2,1)到(2,8)这8个位置而在这8 个位置里并没有试完就有空位置 (2,3)此时计算机会在这个位置对下一层里开始试(3,1)..(3,8)依次类推,试不通的返回,接着走完上一层直到试完所有的位置! 8? */ #include "stdafx.h" int column[8]; int ldiag[16]; /* 1.................8 +-----------------+ | | 9 | | 10 | / | . | | . | | | | +-----------------+ 16 */ int rdiag[16]; /* 9...............16 8 +---------------+ ; | | ; | / | 5 | | 4 | | 3 | | 2 | | 1 +---------------+ */ int result[8]; int TOTAL=1; //int current_row; //当前寻找可放置的ROW int init_panel() { int i; for (i=0;i<16;i++) { ldiag[i]=rdiag[i]=1; } for (i=0;i<8;i++) { column[i]=1; } // current_row=0; return 0; } int print_it () { int i,j; printf(" ---%d----/n",TOTAL); TOTAL++; for (i=0;i<8;i++) { for (j=0;j<8;j++) { if (result[i]==j) printf (" *"); else printf (" ."); } printf("/n"); } return 0; } int tryit( int current_row) { int col; //printf ("/ncurrent_row=%d/n",current_row); for (col=0;col<8;col++) { if (column[col] && ldiag[col+current_row] && rdiag[col+8-current_row]) //is placable? { //occupy column[col]=0; ldiag[col+current_row]=0; rdiag[col+8-current_row]=0; result[current_row]=col; if ( current_row == 7 ) print_it(); //printf ("->(%d,%d)",current_row+1,col+1); tryit (current_row+1); } }//not found HUITUI //clear occpuy,becasu it is global variable //printf (" <<- /n"); ldiag[result[current_row-1]+current_row-1]=1; column[result[current_row-1]]=1; rdiag[result[current_row-1]+8-current_row+1]=1; return 0; } int _tmain(int argc, _TCHAR* argv[]) { init_panel(); tryit(0); return 0; }

Java实现八皇后问题,用数组递归算法,简单易懂

八皇后问题要将八个皇后放在棋盘上,任何两个皇后都不能互相攻击。即没有两个皇后是在同一行、同一列或者同一对角上。典型的八皇后问题,使用Java写的算法,算法虽比较简单,但难免会有新手会犯疏漏和错误,希望...
  • H_JinXian
  • H_JinXian
  • 2016年04月07日 19:43
  • 2487

C++简单实现八皇后问题

近来无聊,想着几年前用c#实现的八皇后,是参考网上的答案,如今过了几年,想试试有没进步,用c++简单地实现。 八皇后问题,是回溯算法的经典例子,它的规则要求是同一行同一列同一条斜线不能有两个皇后,不然...
  • xanxus46
  • xanxus46
  • 2014年03月21日 16:35
  • 6521

算法学习笔记之三:八皇后问题(递归、回溯)

(一)题记 从去年下半年开始找工作,大大小小也被“鄙”试、“面”试了n多回了。说实话只怪自己并未对常见的笔试题、面试题进行准备,导致败下阵来。一门学问要想学透学精是需要时间的,慢慢来吧…… 第一次听到...
  • zssureqh
  • zssureqh
  • 2014年03月12日 21:33
  • 31395

八皇后问题的C++实现

  • 2017年09月23日 08:39
  • 446KB
  • 下载

八皇后问题

  • 2017年12月28日 18:15
  • 156KB
  • 下载

八皇后及其拓展问题

  • 2017年12月02日 14:41
  • 181KB
  • 下载

八皇后问题源码 python

  • 2017年12月04日 18:52
  • 6KB
  • 下载

利用c++解决八皇后问题

  • 2017年11月27日 23:51
  • 784B
  • 下载

八皇后问题

  • 2015年12月14日 16:22
  • 119KB
  • 下载

八皇后问题

  • 2015年07月07日 18:13
  • 36KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:八皇后问题
举报原因:
原因补充:

(最多只允许输入30个字)