写了很多次
终于做出来了!
解题思路:显然问题的关键在于如何判定某个皇后所在的行,列,斜线上是否有别的皇后
可以从矩阵的特点上找到规律,如果在同一行,则行号相同;如果在同一列上,则列好相同;如果同在/斜线上,则行列值之和相同;如果同在\斜线上,则行列值之差相同;下图可验证:
考虑每行有且仅有一个皇后,设一维数组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 人评分
C语言程序设计教程(第三版)课后习题11.1 (C语言代码)浏览:822 |
C语言训练-计算t=1+1/2+1/3+...+1/n (C语言代码)浏览:910 |
哥德巴赫曾猜测 (C语言代码)浏览:1150 |
C语言程序设计教程(第三版)课后习题11.8 (C语言代码)浏览:910 |
2006年春浙江省计算机等级考试二级C 编程题(2) (C语言代码)浏览:503 |
sizeof的大作用 (C语言代码)浏览:1593 |
C语言程序设计教程(第三版)课后习题3.7 (C语言代码)浏览:561 |
1048题解(读入回车问题)浏览:628 |
C语言程序设计教程(第三版)课后习题6.9 (C语言代码)浏览:609 |
简单的a+b (C语言代码)浏览:444 |