无名氏


私信TA

用户名:dotcpp0669591

访问量:1781

签 名:

成功的路上并不拥挤,因为坚持的人并不多

等  级
排  名 2787
经  验 2153
参赛次数 6
文章发表 13
年  龄 13
在职情况 学生
学  校 淮南龙湖中学
专  业

  自我简介:

我是阳光开朗大女孩,不太喜欢C语言,中学生

写了很多次

终于做出来了!

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

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

题解.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分

2 人评分

  评论区

  • «
  • »