描述:
输出8皇后问题所有结果。
输入:
没有输入。
输出:
每个结果第一行是No n:的形式,n表示输出的是第几个结果;下面8行,每行8个字符,‘A’表示皇后,‘.’表示空格。不同的结果中,先输出第一个皇后位置靠前的结果;第一个皇后位置相同,先输出第二个皇后位置靠前的结果;依次类推。
输入样例:
输出样例:
输出的前几行:
No 1:
A.......
....A...
.......A
.....A..
..A.....
......A.
.A......
...A....
No 2:
A.......
.....A..
.......A
..A.....
......A.
...A....
.A......
....A...
题解:
定义一个数组 c[ ] 用来存放第i行对应的是第j列,判断每一行哪个位置能放,能放就继续搜索下去,不能就回溯。
代码:
#include <iostream> #include <string.h> #include <stdio.h> using namespace std; int k=1,c[8],a[8][8]; bool isok(int row) { for(int j=0;j!=row;j++){ if(c[row]==c[j]||row-c[row]==j-c[j]||row+c[row]==j+c[j]) return false; } return true; } void queen(int row) { if(row==8){ printf("No %d: ",k++); for(int i=0;i<8;i++){ for(int j=0;j<8;j++){ if(a[i][j]==1) cout<<'A'; else cout<<'.'; } cout<<endl; } } else { for(int col=0;col!=8;col++){ c[row]=col; if(isok(row)) {a[row][col]=1; queen(row+1);a[row][col]=0;} } } } int main() { queen(0); return 0; }