早教吧作业答案频道 -->其他-->
帮忙解决一道大学c++题八皇后问题。在一个8*8的国际象棋盘,有八个皇后,每个皇后占一格:要求棋盘上放上八个皇后是不出现相互“攻击”的现象,即不能有两个皇后在同一行、列或对角
题目详情
帮忙解决一道大学c++题
八皇后问题。在一个8*8的国际象棋盘,有八个皇后,每个皇后占一格:要求棋盘上放上八个皇后是不出现相互“攻击”的现象,即不能有两个皇后在同一行、列或对角线上。问共有多少种不同的方法。
八皇后问题。在一个8*8的国际象棋盘,有八个皇后,每个皇后占一格:要求棋盘上放上八个皇后是不出现相互“攻击”的现象,即不能有两个皇后在同一行、列或对角线上。问共有多少种不同的方法。
▼优质解答
答案和解析
有92种,代码如下:
#include
#include
#include//头文件调用
int c = 0;//统计八皇后摆放总数
int i = 0;//统计比较次数
void PrintTheChessBoard(int queens[], int n)//打印棋盘
{
int i, j;//控制循环
printf("NO. %d method.\n",c); //输出第num种摆法
for (i = 0; i < n; i ++)//控制循环
{
for (j = 0; j < queens[i]; j ++)
{
printf(" *");//打印*
}
printf(" Q");//打印皇后
for (j = n-1; j > queens[i]; j --)
{
printf(" *");//打印*
};
putchar('\n');//换行
}
printf("Please press enter to see the next answer\n\n");//按回车键输出下个方案
//getch();//从键盘获取字符
}
int CheckTheChessBoard(int queens[], int i)// 检查棋盘从第 0 行到第 i 行的布局是否合法。
{
int j, k;
for (j = 0; j <= i; j ++)//循环控制
{
for (k = 0; k <= i; k ++)//循环控制
{
if (j != k && (queens[j] == queens[k]||abs(queens[j] - queens[k]) == abs(j - k)))
//判断是否在对角线上
//判断皇后是否在同一行
//判断皇后是否在同一列上
{
return 0;//若在同一行,同一列或者同一对角线上,返回0
}
}
}
return 1;//若在同一行,同一列或者同一对角线上,返回1
}
void Trial(int queens[], int i, int n)//当判断八行皇后摆法格局都合法,则调用打印函数
{
if (i >= n)//当判断皇后摆法都合法时,打印棋盘
{
c ++;
PrintTheChessBoard(queens, n);//调用PrintTheChessBoard()函数,打印皇后
}
else
{
int j;
for (j = 0; j < n; j ++)
{
queens[i] = j;//对queen数组从新赋值
if(CheckTheChessBoard(queens, i))//调用CheckTheChessBoard函数,若返回数为1,就再次调用Trial函数
{
Trial(queens, i + 1, n);
}
}
}
}
void main()
{
printf("The Queen number is Eight \n\n");//定义问题是八皇后
int queens[] = {-1, -1, -1, -1, -1, -1, -1, -1};//给queen数组赋初值
Trial(queens, 0, 8);//调用Trial函数
printf("There is %d answers for the 8 Queen question\n\n",c);
getch();//从键盘获取字符
}
#include
#include
#include
int c = 0;//统计八皇后摆放总数
int i = 0;//统计比较次数
void PrintTheChessBoard(int queens[], int n)//打印棋盘
{
int i, j;//控制循环
printf("NO. %d method.\n",c); //输出第num种摆法
for (i = 0; i < n; i ++)//控制循环
{
for (j = 0; j < queens[i]; j ++)
{
printf(" *");//打印*
}
printf(" Q");//打印皇后
for (j = n-1; j > queens[i]; j --)
{
printf(" *");//打印*
};
putchar('\n');//换行
}
printf("Please press enter to see the next answer\n\n");//按回车键输出下个方案
//getch();//从键盘获取字符
}
int CheckTheChessBoard(int queens[], int i)// 检查棋盘从第 0 行到第 i 行的布局是否合法。
{
int j, k;
for (j = 0; j <= i; j ++)//循环控制
{
for (k = 0; k <= i; k ++)//循环控制
{
if (j != k && (queens[j] == queens[k]||abs(queens[j] - queens[k]) == abs(j - k)))
//判断是否在对角线上
//判断皇后是否在同一行
//判断皇后是否在同一列上
{
return 0;//若在同一行,同一列或者同一对角线上,返回0
}
}
}
return 1;//若在同一行,同一列或者同一对角线上,返回1
}
void Trial(int queens[], int i, int n)//当判断八行皇后摆法格局都合法,则调用打印函数
{
if (i >= n)//当判断皇后摆法都合法时,打印棋盘
{
c ++;
PrintTheChessBoard(queens, n);//调用PrintTheChessBoard()函数,打印皇后
}
else
{
int j;
for (j = 0; j < n; j ++)
{
queens[i] = j;//对queen数组从新赋值
if(CheckTheChessBoard(queens, i))//调用CheckTheChessBoard函数,若返回数为1,就再次调用Trial函数
{
Trial(queens, i + 1, n);
}
}
}
}
void main()
{
printf("The Queen number is Eight \n\n");//定义问题是八皇后
int queens[] = {-1, -1, -1, -1, -1, -1, -1, -1};//给queen数组赋初值
Trial(queens, 0, 8);//调用Trial函数
printf("There is %d answers for the 8 Queen question\n\n",c);
getch();//从键盘获取字符
}
看了帮忙解决一道大学c++题八皇后...的网友还看了以下:
某人射击8枪击中4枪,这4枪中恰有3枪连在一起的不同种数为多少?为什么不是A43*A66-A44* 2020-04-06 …
在中文Windows98文件夹窗口中,要对多个文件进行操作时,先单击第一项,按住( )键,然后单击最 2020-05-21 …
六级估分,我今年考得六级,听力前面八个对四个,后面的两个短文段对3个,长文段对8个,填词对3个,长 2020-06-07 …
如图,DEFG为矩形的台球桌面,现有球A、B位置如图,按下列要求,画出击打后球的线路.(1)击打球 2020-06-16 …
质量为0.2kg的垒球以30m/s的速度飞向击球手,经击球手奋力打击后,以50m/s的速度反弹。设 2020-07-04 …
一个网球运动员抡动他的1kg球拍以8.00m每秒速度击中一个向他以14m每秒飞来的球反弹后速度39米 2020-10-30 …
(2011•南宁)2011年6月4日,中国选手李娜勇夺法网女单冠军.比赛中,李娜用球拍击球,将网球击 2020-11-07 …
在电脑游戏中“主角”的生命机会往往被预先设定.如某枪战游戏主角被设置生命5次每次生命承受射击8次(被 2021-01-08 …
电脑游戏中,“主角”的生命机会往往被预先设定,如某枪战游戏,“主角”被设定生命机会5次,每次生命承受 2021-01-08 …
在电脑游戏中,“主角”的生命机会往往被预先设定.如某枪战游戏,“主角”被设置生命6次,每次生命承受射 2021-01-08 …