找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1736|回复: 3
打印 上一主题 下一主题
收起左侧

如何利用51单片机8*8矩阵解决八皇后问题?

[复制链接]
跳转到指定楼层
楼主
ID:427405 发表于 2019-2-20 21:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在网上看到了八皇后问题,用8*8应该这么做:
将八个点填入8x8的点阵中,要求每一行、每一列、每一条斜线(倾斜角度为45°或135°的方向)上最多只有一个点。将满足条件的情况显示在led点阵
其中,我利用C语言已经求出了92种情况,并可以用矩阵输出
代码如下
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define N 8

  4. int column[N+1];//同栏是否有皇后
  5. int rup[2*N +1];//右上至左下是否有皇后
  6. int lup[2*N +1];//左上至右下是否有皇后
  7. int queen[N+1] = {0};
  8. int num ;//解答编号

  9. void backtrack(int);//递回求解

  10. main(void)
  11. {
  12.         int i;
  13.         num = 0;
  14.         for(i=1;i<=N;i++)
  15.                 column[i] = 1;

  16.         for(i=1;i<=2*N;i++)
  17.                 rup[i] = lup[i] = 1;

  18.         backtrack(1);

  19.         system("pause");
  20.         return 0;
  21. }

  22. void showAnswer()
  23. {
  24.         int x,y;
  25.         printf("\n 解答 %d\n",++num);
  26.         for (y=1;y<=N;y++)
  27.         {
  28.                 for (x=1;x<=N;x++)
  29.                 {
  30.                         if(queen[y] == x)
  31.                                 printf("1");
  32.                         else
  33.                                 printf("0");
  34.                 }
  35.                 printf("\n");
  36.         }
  37. }

  38. void backtrack(int i)
  39. {
  40.         int j;
  41.         if(i > N)
  42.                 showAnswer();
  43.         else
  44.                 for (j=1;j<=N;j++)
  45.                 {
  46.                         if(column[j] == 1 && rup[i+j] == 1 &&lup[i-j+N] == 1){
  47.                                 queen[i] = j;
  48.                                 //设定为占用
  49.                                 column[j] = rup[i+j] = lup[i-j+N] = 0;
  50.                                 backtrack(i+1);
  51.                                 column[j] = rup[i+j] = lup[i-j+N] = 1; //在左下角递归完后进行下一个位置的递归运算                                                                                       
  52.                         }
  53.                 }
  54. }
复制代码


请问怎么用单片机来实现(我希望可以实现每种情况循环显示)?希望各位能给个思路,谢谢!
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:213173 发表于 2019-2-21 10:38 | 只看该作者
楼主的八皇后游戏很古老,似乎趣味性不大。楼主想通过8x8的点阵LED显示结果也不难,可以定义一个unsigned int 数组,把运算结果按序保存在数组中。再按序循环读取数组的数据赋值于8x8点阵LED的驱动端口即可。
回复

使用道具 举报

板凳
ID:303383 发表于 2019-2-21 12:08 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

地板
ID:164602 发表于 2019-2-21 14:21 | 只看该作者
才92种?非常非常多吧,N多年前,计算机奥赛小组的老师用老菜果机、汇编语言,算出了成千上万种。那个老师把堆栈玩得非常好。当时如果用带图形(八个皇后图形移动,看到一个个的结果)的BASIC语言算,要算几天,汇编不带图形,要算一个多小时(机器歪)。关键在算法。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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