写了很多次

终于做出来了!

解题思路:显然问题的关键在于如何判定某个皇后所在的行,列,斜线上是否有别的皇后

可以从矩阵的特点上找到规律,如果在同一行,则行号相同;如果在同一列上,则列好相同;如果同在/斜线上,则行列值之和相同;如果同在\斜线上,则行列值之差相同;下图可验证:

题解.png

    考虑每行有且仅有一个皇后,设一维数组a[1...8]表示皇后的放置:第i行皇后放在第j列,用a[i]=j来表示,即下标是行数,内容是列数。例如:a[3]=5就表示第3个皇后在第3行第5列上。

    判断皇后是否安全,即检查同一列、同一对角线是否已有皇后,建立标志数组b[1...8]控制同一列只有一个皇后,若两皇后在同一对角线上,则其行列坐标之和或行列坐标之差相等,故亦可建立标志数组c[i...6]、d[-7..7]控制同一对角线上只能有一个皇后。

    如果斜线不分方向,则同一斜线上两皇后的行号之差的绝对值与列号之差的绝对值相同。在这种方式下,要表示两个皇后i和j不在同一列或斜线上的条件可以描述为:(a[i]!=a[j])&&(abs(i-j)!=abs(a[i]-a[j])){i和j分别表示两个皇后的行号}

注意事项:注意题目就行

参考代码:

#include<cstdio>

#include<bits/stdc++.h>

#include<iostream>

#include<string>

#include<cstdlib>

#include<iomanip>

using namespace std;

bool d[17]={0},b[9]={0},c[17]={0};

int sum=0,a[9];

int search(int);

int print();

int main(){

search(1);

}

int search(int i){

int j;

for(j=1;j<=8;j++)

if((!b[j])&&(!c[i+j])&&(!d[i-j+7])){

a[i]=j;

b[j]=1;

c[i+j]=1;

d[i-j+7]=1;

if(i==8)print();

else search(i+1);

b[j]=0;

c[i+j]=0;

d[i-j+7]=0;

}

}

int print(){

int i;

sum++;

cout<<"sum="<<sum<<endl;

for(i=1;i<=8;i++)

cout<<setw(4)<<a[i];

cout<<endl;

}

拜拜了您嘞(QuQ)

点赞(0)
 

0.0分

2 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论