递归
#include <stdio.h>
#include <string.h>
#include <cmath>
#include <iostream>
using namespace std;
int tot;
bool hashmap[10]={false};
int pos[10]={0};
int Queens[95][9];
void generateQ(int index){
if(index==9){
tot++;
for(int i=1;i<=8;i++)
Queens[tot][i]=pos[i];
return;
}
//按列存放
for(int i=1;i<=8;i++){//遍历该行
if(hashmap[i]==false){//代表该列还没有皇后
bool flag=true;
for(int pre=1;pre<index;pre++)//遍历前面的行
if(abs(index-pre)==abs(i-pos[pre])){
flag=false;
break;
}
if(flag){//如果不会发生冲突
pos[index]=i;
hashmap[i]=true;//代表该列已经有皇后
generateQ(index+1);
hashmap[i]=false;
}
}
}
}
int main(){
generateQ(1);
int n=0;
scanf("%d",&n);
while(n--){
int m=0;
scanf("%d",&m);
for(int i=1;i<=8;i++)
printf("%d",Queens[m][i]);
printf("\n");
}
return 0;
}
DFS法(实则也是递归)
例题:n皇后 问题(原始的8皇后问题)
Description
会下国际象棋的人都很清楚:皇后可以在横、竖、斜线上不限步数地吃掉其他棋子。如何将8个皇后放在棋盘上(有8 * 8个方格),使它们谁也不能被吃掉!这就是著名的八皇后问题。
Input
一个整数n( 1 < = n < = 10 )
Output
每行输出对应一种方案,按字典序输出所有方案。每种方案顺序输出皇后所在的列号,相邻两数之间用空格隔开。如果一组可行方案都没有,输出“no solute!”
Sample Input Copy
4
Sample Output Copy
2 4 1 3
3 1 4 2
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <cstdlib>
using namespace std;
int chessset[15]={-1};//该行皇后存储所在位置
int n;//n皇后
int flag=false;
bool check(int row,int col){
for(int i=0;i<row;i++){
if(chessset[i]==col+1||abs(chessset[i]-col-1)==abs(i-row))
return false;
}
return true;
}
void dfs(int row){
if(row==n){
flag=true;
for(int i=0;i<n;i++){
printf("%d%c", chessset[i], (i+1)==n?'\n':' ');
}
return;
}
else{
for(int i=0;i<n;i++){
if(check(row,i)){
chessset[row]=i+1;
dfs(row+1);
}
}
}
}
int main(){
while(scanf("%d",&n)!=EOF){
flag=false;//判断是否有解答
memset(chessset, 0, sizeof(chessset));
dfs(0);
if(flag==false){
printf("no solute!\n");
}
}
}