c++求解8皇后问题
注意:如果可以吧n皇后问题也解一下!!!问题 A: 【提高】8皇后问题时间限制: 1.000 Sec 内存限制: 32 MB提交: 2550 解决: 1362[提交] [状态] [报告] [命题人:][下载数据: ?]题目描述 在一个8*8的棋盘上放置8个皇后,且使得每两个之间不能互相攻击,也就是使得每两个不在同一行,同一列和同一斜角线上。以下为8皇后问题的一个解:输入无输出 若干行,每行8个数a_i(i:=1..8),表示第i行的皇后放置在第a_i列。一行表示一个解。样例输入 复制输出 复制以下尽力解:问题 J: 【基础】N皇后问题时间限制: 1.000 Sec 内存限制: 16 MB提交: 3748 解决: 1111[提交] [状态] [报告] [命题人:][下载数据: ?]题目描述在一个N*N的棋盘上放置N个皇后,且使得每两个之间不能互相攻击,也就是使得每两个不在同一行,同一列和同一斜角线上。以下为N=8时问题的一个解: 输入一个整数N(4<=N<=10)输出N皇后的所有解。样例输入 复制4输出 复制4 Q
3 Q
2 Q
1 Q
a b c d
4 Q
3 Q
2 Q
1 Q
a b c d提示输出格式说明: a的场宽为4,其它数字和字母的场宽均为2,两种解法之间空一行。最后一种解法后没有多余空行。每一个Q后面没有空格。
8皇后问题,任何一本数据结构及网上教程都可以找到完整的程序
而N皇后问题相对就复杂些了,以下是我OJ可的程序参考
#include <iostream>
#include <cstdio>
using namespace std;
int n;
int x[1001];
long sum,out;
void OutPut(void)
{
int i, j;
if (sum!=1)
printf("
");
for(i = 1; i <= n; i++)
{
printf("%2d",n-i+1);
for(j = 1; j <= n; j++)
if(x[i] == j)
printf(" Q");
else
printf(" ");
printf("
");
}
printf(" a");
for(i=1;i<n;i++)
printf("%2c",'a'+i);
printf("
");
// printf(" a b c d
");
}
int Place(int k)
{
int j;
for(j = 1; j < k; j++)
if((abs(k - j) == abs(x[j] - x[k])) || (x[j] == x[k]))
return 0;
return 1;
}
void BackTrack(int t)
{
int i;
if(t > n)
{
sum++;
OutPut();
}
else
for(i = 1; i <= n; i++)
{
x[t] = i;
if(Place(t))
BackTrack(t + 1);
}
}
int main()
{
int i;
scanf("%d", &n);
sum = out=0;
for(i = 0; i <= n; i++)
x[i] = 0;
BackTrack(1);
return 0;
}
测试结果
而第一个问题,可以在第二个做简单修改
下一篇:电脑桌面壁纸高清大图
上一篇:if函数多个并列条件or