|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
八皇后问题,头疼了三天
依然不知道如何写判断(写过一个笨方法,下皇后之后立刻对横竖及斜方向标记,事实上不行)
网上找到一段代码,巧妙的程度令人乍舌,但就是因为太巧妙了,几乎看不清楚作者的模型
作者已联系不上了,下面贴上这段代码,望有人能分析出原作者的模型
或者留言写下如何判断皇后放置位置的方法也行,感激不尽
以下是网上的源代码,可直接执行:
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<conio.h>
#define N 8 //皇后数=棋盘行列数
int a[N]; //a[i]为第i行皇后所在列
void show() //图形化输出
{
int i;
int p, q;
int b[N][N] = { 0 };
static t = 1;
printf("第%d个解为: ", t++);
for (i = 0; i<N; i++)
{
b[i][a[i]] = 1;
printf("(%d,%d) ", i, a[i]);
}
printf("\n");
for (p = 0; p<N; p++)
{
for (q = 0; q<N; q++)
{
if (b[p][q] == 1)
printf("●");
else
printf("○");
}
printf("\n");
}
}
int check(int n) //满足条件返回1,否则返回0
{
int i;
for (i = 0; i<n; i++)
{
if (a[i] == a[n] || fabs(n - i) == fabs(a[i] - a[n])) //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[n] = i;
if (check(n)) //位置合法
{
if (n == N - 1) //皇后全部放置完毕
show();
else
put(n + 1);
}
}
}
int main()
{
put(0);
return 0;
}
|
|