标题:
如何利用51单片机8*8矩阵解决八皇后问题?
[打印本页]
作者:
Price1
时间:
2019-2-20 21:20
标题:
如何利用51单片机8*8矩阵解决八皇后问题?
在网上看到了八皇后问题,用8*8应该这么做:
将八个点填入
8x8
的点阵中,要求每一行、每一列、每一条斜线(倾斜角度为
45
°或
135
°的方向)上最多只有一个点。
将满足条件的情况显示在
led
点阵
上
其中,我利用C语言已经求出了92种情况,并可以用矩阵输出
代码如下
#include <stdio.h>
#include <stdlib.h>
#define N 8
int column[N+1];//同栏是否有皇后
int rup[2*N +1];//右上至左下是否有皇后
int lup[2*N +1];//左上至右下是否有皇后
int queen[N+1] = {0};
int num ;//解答编号
void backtrack(int);//递回求解
main(void)
{
int i;
num = 0;
for(i=1;i<=N;i++)
column[i] = 1;
for(i=1;i<=2*N;i++)
rup[i] = lup[i] = 1;
backtrack(1);
system("pause");
return 0;
}
void showAnswer()
{
int x,y;
printf("\n 解答 %d\n",++num);
for (y=1;y<=N;y++)
{
for (x=1;x<=N;x++)
{
if(queen[y] == x)
printf("1");
else
printf("0");
}
printf("\n");
}
}
void backtrack(int i)
{
int j;
if(i > N)
showAnswer();
else
for (j=1;j<=N;j++)
{
if(column[j] == 1 && rup[i+j] == 1 &&lup[i-j+N] == 1){
queen[i] = j;
//设定为占用
column[j] = rup[i+j] = lup[i-j+N] = 0;
backtrack(i+1);
column[j] = rup[i+j] = lup[i-j+N] = 1; //在左下角递归完后进行下一个位置的递归运算
}
}
}
复制代码
请问怎么用
单片机
来实现(我希望可以实现每种情况循环显示)?希望各位能给个思路,谢谢!
作者:
wulin
时间:
2019-2-21 10:38
楼主的八皇后游戏很古老,似乎趣味性不大。楼主想通过8x8的点阵LED显示结果也不难,可以定义一个unsigned int 数组,把运算结果按序保存在数组中。再按序循环读取数组的数据赋值于8x8点阵LED的驱动端口即可。
作者:
小猫猫爱吃鱼
时间:
2019-2-21 12:08
单片机后续的关键是显示;
1、确定8*8点阵屏幕和驱动;
2、连接好线路,点亮点阵屏;
3、把皇后的解法,分别显示;
4、加入按键,控制上下选项。
作者:
HC6800-ES-V2.0
时间:
2019-2-21 14:21
才92种?非常非常多吧,N多年前,计算机奥赛小组的老师用老菜果机、汇编语言,算出了成千上万种。那个老师把堆栈玩得非常好。当时如果用带图形(八个皇后图形移动,看到一个个的结果)的BASIC语言算,要算几天,汇编不带图形,要算一个多小时(机器歪)。关键在算法。
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1