八皇后问题
Description
相信大家都听过经典的"八皇后"问题吧?
这个游戏要求在一个8×8的棋盘上放置8个皇后,
使8个皇后互相不攻击( 攻击的含义是有两个皇后在同一行或同一列或同一对角线上)。
桐桐对这个游戏很感兴趣,现在他想知道每种合法的摆放方案.
Input
无
Output
输出若干行,每行一个种方案,也就是8个数字,中间不要用空格分开
HINT
这是很经典的问题,不多说上代码:
方法一(DFS递归):
#include<iostream>
using namespace std;
static int gEightQueen[8],gCount=0;
void print() {
for (int i=0; i < 8; i++) {
int inner;
for (inner=0; inner < gEightQueen[i]; inner++);
cout <<inner+1;
}
cout<<endl;
}
int check_pos_valid(int loop, int value) {
int index;
int data;
for (index=0; index < loop; index++) {
data=gEightQueen[index];
if (value == data)
return 0;
if ((index+data) == (loop+value))
return 0;
if ((index - data) == (loop - value))
return 0;
}
return 1;
}
void eight_queen(int index) {
int loop;
for (loop=0; loop < 8; loop++) {
if (check_pos_valid(index, loop)) {
gEightQueen[index]=loop;
if (7 == index) {
gCount++, print();
gEightQueen[index]=0;
return;
}
eight_queen(index+1);
gEightQueen[index]=0;
}
}
}
int main() {
eight_queen(0);
return 0;
}
方法一(暴力枚举法):
#include<bits/stdc++.h>
using namespace std;
int main() {
for(int a1=1; a1<=8; a1++)
for(int a2=1; a2<=8; a2++)
for(int a3=1; a3<=8; a3++)
for(int a4=1; a4<=8; a4++)
for(int a5=1; a5<=8; a5++)
for(int a6=1; a6<=8; a6++)
for(int a7=1; a7<=8; a7++)
for(int a8=1; a8<=8; a8++) {
if(a1!=a2&&a1!=a3&&a1!=a4&&a1!=a5&&a1!=a6&&a1!=a7&&a1!=a8
&&abs(a1-a2)!=1
&&abs(a1-a3)!=2
&&abs(a1-a4)!=3
&&abs(a1-a5)!=4
&&abs(a1-a6)!=5
&&abs(a1-a7)!=6
&&abs(a1-a8)!=7
&&a2!=a3&&a2!=a4&&a2!=a5&&a2!=a6&&a2!=a7&&a2!=a8
&&abs(a2-a3)!=1
&&abs(a2-a4)!=2
&&abs(a2-a5)!=3
&&abs(a2-a6)!=4
&&abs(a2-a7)!=5
&&abs(a2-a8)!=6
&&a3!=a4&&a3!=a5&&a3!=a6&&a3!=a7&&a3!=a8
&&abs(a3-a4)!=1
&&abs(a3-a5)!=2
&&abs(a3-a6)!=3
&&abs(a3-a7)!=4
&&abs(a3-a8)!=5
&&a4!=a5&&a4!=a6&&a4!=a7&&a4!=a8
&&abs(a4-a5)!=1
&&abs(a4-a6)!=2
&&abs(a4-a7)!=3
&&abs(a4-a8)!=4
&&a5!=a6&&a5!=a7&&a5!=a8
&&abs(a5-a6)!=1
&&abs(a5-a7)!=2
&&abs(a5-a8)!=3
&&a6!=a7&&a6!=a8
&&abs(a6-a7)!=1
&&abs(a6-a8)!=2
&&a7!=a8
&&abs(a7-a8)!=1
) cout<<a1<<a2<<a3<<a4<<a5<<a6<<a7<<a8<<endl;
}
}
没了…不要嫌弃太短了