八皇后
八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。
高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。计算机发明后,有多种计算机语言可以解决此问题。
C语言解法
你当然可以写8个for循环,但这不是蓝桥杯。
思路是这样的,每一行只能放一个皇后,这是这个问题的特点(当然每一列每一条斜线上都只能放一个皇后,这里我们放在检查部分讨论)
首先说一下步骤:
- 在这一行随便找个位置放下去
- 检查这个位置能不能放
- 检查到能放了,进行下一行位置的判断(也就是递归到第一步)
- 回溯,找这一行还有没有另一个位置能放
第四步乍一看可能想不通,因为我没有做一张直观的图出来,咱们看代码。
int cnt = 0;
int table[8] = {
-1,-1,-1,-1,-1,-1,-1,-1};
cnt计数八皇后问题有多少个解
table数组表示第几行的第几列已经放置了皇后,若该行还未放置皇后,则为-1
void queen(int y)
{
int x = 0;//x表示要放置棋子的位置
if(y > 7)//如果第y行是最后一行
{
show();//打印棋盘
cnt++;//解法+1
}
else{
for(x = 0; x < 8; x++)//从y行的0号位开始放置一个棋子
{
if(check(x,y))//如果这个位置允许放置
{
table[y] = x;//保存这个位置
queen(y+1);//去下一行寻找合适的位置