八皇后问题
八皇后问题,头疼了三天依然不知道如何写判断(写过一个笨方法,下皇后之后立刻对横竖及斜方向标记,事实上不行)
网上找到一段代码,巧妙的程度令人乍舌,但就是因为太巧妙了,几乎看不清楚作者的模型
作者已联系不上了,下面贴上这段代码,望有人能分析出原作者的模型
或者留言写下如何判断皇后放置位置的方法也行,感激不尽
以下是网上的源代码,可直接执行:
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<conio.h>
#define N 8 //皇后数=棋盘行列数
int a; //a为第i行皇后所在列
void show() //图形化输出
{
int i;
int p, q;
int b = { 0 };
static t = 1;
printf("第%d个解为: ", t++);
for (i = 0; i<N; i++)
{
b] = 1;
printf("(%d,%d) ", i, a);
}
printf("\n");
for (p = 0; p<N; p++)
{
for (q = 0; q<N; q++)
{
if (b == 1)
printf("●");
else
printf("○");
}
printf("\n");
}
}
int check(int n) //满足条件返回1,否则返回0
{
int i;
for (i = 0; i<n; i++)
{
if (a == a || fabs(n - i) == fabs(a - a)) //at the same column or diagonal (对角线)
return 0;
}
return 1;
}
void put(int n) //在第n行放置第n个皇后
{
int i;
if (n == N)
return;
for (i = 0; i<N; i++)
{
a = i;
if (check(n)) //位置合法
{
if (n == N - 1) //皇后全部放置完毕
show();
else
put(n + 1);
}
}
}
int main()
{
put(0);
return 0;
}
我记得好像可以用for循环出来不知道对不对 ,我只是菜鸟{:5_100:} 看不懂,一想就头疼
页:
[1]