八皇后问题

本文介绍了一种解决八皇后问题的算法实现,通过递归和回溯的方式在8*8的棋盘上放置8个皇后,确保任意两个皇后不在同一行、列或对角线上。代码使用C语言编写,展示了如何利用数组记录各位置状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述
在8*8的国际象棋棋盘中,摆放8个皇后,使得每一行、每一列、每一条斜线上都只有一个皇后。
问题分析
先在第一行的第一个位置摆放第一个皇后
1
接着在第二行顺序查找摆皇后的位子
这里写图片描述
以此类推:
这里写图片描述
这里写图片描述
下一行没有符合摆放皇后的位置。说明上一行摆放的皇后位置不合适。返回上一行重新摆放皇后。(开始回溯)
这里写图片描述
当前行依旧摆放不了皇后,继续回溯
这里写图片描述
以此类推直到八个皇后都放到棋盘上。
算法描述:

记录每个坐标的状态:
用数组:
col[8]——–记录每一列的状态
left[15]——记录每一条左斜线的状态
right[15]—–记录每一条右斜线的状态
坐标和左右斜线的关系:
(i,j)
left[i+j]
right[7+i-j]
用Queen[8]来记录皇后的坐标—-下标代表皇后所在的行,所对应的值代表皇后所在的列。

#include<stdio.h>
#include<stdlib.h>
int col[8] = { 0 };//用来记录皇后在每一行的状态
int Queen[8];//用来记录皇后的坐标
int left[15] = { 0 }, right[15] = { 0 };//分别用来记录皇后在每一条斜线(左右)的状态
int count = 0;//用来记录摆法的组数
//输出八皇后
void printQueen(int Queen[8]){
    for (int i = 0; i < 8; i++){
        for (int j = 0; j < 8; j++){
            if (Queen[i] == j){
                printf(" $  ");
            }
            else{
                printf(" +  ");
            }
        }
        printf("\n\n");
    }
    printf("\n\n");
}
//八皇后问题
void queen(int i){
    for (int j = 0; j < 8; j++){
        if (!col[j] && !left[i + j] && !right[7 + i - j]){
            //证明当前位置和之前摆放皇后的位置不发生冲突,(当前位置可以摆放皇后)
            Queen[i] = j;//在当前位置摆放皇后
            //更改当前位置的状态
            col[j] = left[i + j] = right[7 + i - j] = 1;
            if (i < 7){
                queen(i + 1);//摆放下一个皇后
                //当前行摆放不了皇后,开始回溯,更改上一个皇后的位置
                col[j] = left[i + j] = right[7 + i - j] = 0;

            }
            else{
                printf("第%d组\n", ++count);
                printQueen(Queen);
                //找下一组解
                col[j] = left[i + j] = right[7 + i - j] = 0;
            }
        }
    }
}
int main(void){
    queen(0);
    printf("共计:%d\n", count);
    system("pause");
    return 0;
}

调试结果:
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值