永发信息网

14皇后的解的个数

答案:3  悬赏:30  手机版
解决时间 2021-03-09 05:27
我想知道N皇后问题中N=14时的答案是多少~~我做的是365596~~也不知道计数器是不是做的对~我做了2个程序由于计数器问题把我自己弄糊涂了~~~所以有知道确切答案的麻烦跟我说下吧~~谢谢了
最佳答案
#include <iostream>
#include <fstream>
using namespace std;

int NUM=10;
bool a[20][20];
int count=0;
ofstream fout("output.txt");
//棋盘初始化
void init()
{
for (int i=0;i<NUM;i++)
for (int j=0;j<NUM;j++)
{
a[i][j]=false;
}
}

//判断当前位置是否安全,只检查i行之前的,对于i行之后的不予检查
bool isSafe(int i,int j)
{
int tmpI=i;
int tmpJ=j;

//1 2 3
// (i,j)
//1方向检查
while (tmpI>=1 && tmpJ>=1)
{
tmpI--;
tmpJ--;
if (a[tmpI][tmpJ])
return false;
}
//2方向检查
tmpI=i;
tmpJ=j;
while (tmpI>=1)
{
tmpI--;
if (a[tmpI][tmpJ])
return false;
}
//3方向检查
tmpI=i;
tmpJ=j;
while (tmpI>=1 && tmpJ<NUM-1)
{
tmpI--;
tmpJ++;
if (a[tmpI][tmpJ])
return false;
}
//fout<<"Safe("<<i<<","<<j<<")"<<endl;
return true;
}
//输出结果
void output()
{

count++;
fout<<"结果"<<count<<":"<<endl;

for (int i=0;i<NUM;i++)
{
for (int j=0;j<NUM;j++)
{
if (a[i][j])
fout<<"O ";
else
fout<<"* ";

}
fout<<endl;

}
fout<<endl;
}

//往i行放皇后,前i行已经安全放上皇后
void put(int i)
{
if (i>=NUM)
{
count++;
//output();
return;
}
for (int j=0;j<NUM;j++)
{
if (isSafe(i,j))
{
a[i][j]=true;
put(i+1);
//清除状态
a[i][j]=false;
}
}
}
int main()
{
int a,b;
L: cout<<"请输入皇后个数上限:";
cin>>a;
cout<<"请输入皇后个数下限:";
cin>>b;

for (NUM=a;NUM<=b;NUM++)
{

count=0;
init();

put(0);
fout<<"【"<<NUM<<"皇后】共"<<count<<"组解"<<endl;
cout<<"【"<<NUM<<"皇后】共"<<count<<"组解"<<endl;
}
goto L;
}
【1皇后】共1组解
【2皇后】共0组解
【3皇后】共0组解
【4皇后】共2组解
【5皇后】共10组解
【6皇后】共4组解
【7皇后】共40组解
【8皇后】共92组解
【9皇后】共352组解
【10皇后】共724组解
【11皇后】共2680组解
【12皇后】共14200组解
【13皇后】共73712组解
【14皇后】共365596组解
【15皇后】共2279184组解
【16皇后】共14772512组解
全部回答
是的,就是这个答案 #include <iostream> using namespace std; bool a[50],b[50],c[50]; long ans; long n = 14; void search(long t) { if (t == n+1) { ans++; return; } long i; for (i=1; i<=n; i++) { if (!a[i] && !b[i+t] && !c[i-t+20]) { a[i] = b[i+t] = c[i-t+20] = true; search(t+1); a[i] = b[i+t] = c[i-t+20] = false; } } } int main() { memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); memset(c,0,sizeof(c)); search(1); cout << ans << endl; return 0; } 上面是一个没有经过优化的程序。答案是365596~
是的,就是这个答案 #include using namespace std; bool a[50],b[50],c[50]; long ans; long n = 14; void search(long t) { if (t == n+1) { ans++; return; } long i; for (i=1; i<=n; i++) { if (!a[i] && !
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
计算机编程中pi什么意思
雷霆战机为什么会这样,别人的号都不会
凤梨为什么不开花
为什么冉闵会被封杀,为什么
如图,⊙O中,直径为MN,正方形ABCD四个顶点
王者荣耀这游戏基友称号必须要通过对方才能解
福栈米线怎么去啊,有知道地址的么
男朋友老是失言,是不是该继续相信他
【苹果落地是物理学的什么学】
板式家具都用什么软件分解图纸算料,推荐个软
犇羴鱻农家宴地址在哪,我要去那里办事
按揭的新车上了250的牌照别人都笑话怎样才能
各位物理系或者其他物理中数学用的好的人帮忙
什么是级联更新?什么是级联删除?
是金龟子怕蜘蛛还是蜘蛛怕金龟子
推荐资讯
激光打标机电脑屏幕显示的更打标出来不一致怎
碎香旅馆在什么地方啊,我要过去处理事情
AuthorwareQuit(l)
查一下的白城文化小学一年十班的成绩李雨晴的
托收原材料怎么做分录
向人要自己的钱,怎样说话叫含蓄?
别人加不了我的QQ
伊春市新青区卫生监督所我想知道这个在什么地
哈尔滨市南岗果革里大街附近有移动营业厅吗
鑫颖专业烫染旗舰店地址有知道的么?有点事想
用什么借口拿工作证明
经行头痛肝火证的治法是()A.清热平肝息风B.疏
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?