14皇后的解的个数
答案:3 悬赏:30 手机版
解决时间 2021-03-09 05:27
- 提问者网友:杀手的诗
- 2021-03-09 01:39
我想知道N皇后问题中N=14时的答案是多少~~我做的是365596~~也不知道计数器是不是做的对~我做了2个程序由于计数器问题把我自己弄糊涂了~~~所以有知道确切答案的麻烦跟我说下吧~~谢谢了
最佳答案
- 五星知识达人网友:山有枢
- 2021-03-09 02:51
#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 <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组解
全部回答
- 1楼网友:从此江山别
- 2021-03-09 04:45
是的,就是这个答案
#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~
- 2楼网友:逐風
- 2021-03-09 04:17
是的,就是这个答案
#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] && !
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯