易码技术论坛

 找回密码
 加入易码
搜索
查看: 287735|回复: 7

[源码] [源码]关于八皇后问题的解决(深度优先搜索)

[复制链接]
发表于 2006-12-10 16:21:32 | 显示全部楼层
这东西可以稍微有点贪心法上去,加快速度。
发表于 2006-12-12 01:04:51 | 显示全部楼层
这个应该是遍历吧,怎么个贪法?人家可是要所有解的~~一般只有用到最有解才有的贪吧?
发表于 2006-12-12 13:07:12 | 显示全部楼层
让我想起了骑士周游...
 楼主| 发表于 2006-12-16 18:30:15 | 显示全部楼层
这个是找出所有解的程序,怎么用贪心?
发表于 2007-1-20 13:19:26 | 显示全部楼层
MS有种非递归算法 好象在 郑启华的《pascal程序设计(第二版)》清华大学出版社出版里有介绍,忘了怎么写了。。。
发表于 2007-1-20 13:20:20 | 显示全部楼层
其实是我学编程时的一道入门题
发表于 2007-2-10 20:39:44 | 显示全部楼层
引用第5楼szskx2007-01-20 13:19发表的“”:
MS有种非递归算法 好象在 郑启华的《pascal程序设计(第二版)》清华大学出版社出版里有介绍,忘了怎么写了。。。
是回朔法吧,方法就是遍历每一种摆法,然后用递归打印结果,贪心找不到所有解。我还记得pascal源码,有人要吗?
 楼主| 发表于 2006-12-10 14:16:31 | 显示全部楼层 |阅读模式
众所周知的八皇后问题就是在一个8*8的棋盘上放8个皇后,让她们不能互相攻击,求出所有满足条件的情况。
  1. input: n
  2. output: all answers
  3. 以下是源码:
  4. #define MAXN 16
  5. int n;
  6. int nsol,nprinted;
  7. char row[MAXN];
  8. char col[MAXN];      
  9. char updiag[2*MAXN];
  10. char downdiag[2*MAXN];
  11. void solution()
  12. {
  13. int i;
  14. for(i=0; i<n; i++)
  15.   {
  16.   if(i!= 0) printf(" ");
  17.   printf("%d",row[i]+1);
  18.   }
  19. printf("\n");
  20. }
  21. void nway(i,lim)
  22. {
  23. int j;
  24. if(i==n)
  25. {
  26.   nsol++;
  27.   if (n>6&&row[0]<n/2) nsol++;
  28.   if (nprinted++<3) solution();
  29.   return;
  30. }
  31. for(j=0; j<lim; j++)
  32. {
  33.   if(!col[j]&&!updiag[i+j] && !downdiag[i-j+MAXN])
  34.   {
  35.   row[i] = j;
  36.   col[j]++;
  37.   updiag[i+j]++;
  38.   downdiag[i-j+MAXN]++;
  39.   nway(i+1,n);
  40.   col[j]--;
  41.   updiag[i+j]--;
  42.   downdiag[i-j+MAXN]--;
  43.   }
  44. }
  45. }
  46. int main()
  47. {
  48. scanf("%d",&n);
  49. nway(0,n>6?(n+1)/2:n);
  50. printf("%d\n",nsol);
  51. return(0);
  52. }
复制代码
在游戏开发中,也许有时会用到这种算法(如:迷宫问题),希望对大家有帮助。
您需要登录后才可以回帖 登录 | 加入易码

本版积分规则

Archiver|手机版|小黑屋|EMAX Studio

GMT+8, 2024-4-26 06:40 , Processed in 0.011232 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表