#include<iostream>
#include<cstdio>
#include<math.h>
#include<stdlib.h>
using namespace std;
int N;
int a[101];//用来存放放好的皇后的位置,最左上角是(0,0)
int cnt=1;
void Nqueen(int k) {//在0~k-1行已经摆好的情况下,摆放k行及其后的皇后
if(k==N){
cout<<"No. "<<cnt<<endl;
cnt++;
for(int i=0; i<N; i++)
cout<<a[i]+1<<" ";
cout<<endl;
}
for(int i=0; i<N; i++){//逐个尝试第k个皇后的位置
int j;
for(j=0; j<k; j++){
//和已经摆好的k个皇后的位置比较,看是否冲突
if(a[j]==i||abs(a[j]-i)==abs(k-j))
break;//冲突,则下一个位置
}
if(j==k){//当前选的位置i不冲突
a[k]=i;//将第k个皇后放在位置i
Nqueen(k+1);
}
}//for(int i=0;i<N;i++)
return ;
}
int main(){
scanf("%d",&N);
Nqueen(0);//从第0行开始摆放皇后
return 0;
}
执行结果:
相关题目:
八皇后问题
总Time Limit: 10000ms Memory Limit: 65536kB
Description
在国际象棋棋盘上放置八个皇后,要求每两个皇后之间不能直接吃掉对方。
Input
无输入。
Output
按给定顺序和格式输出所有八皇后问题的解(见Sample Output)。
Sample Input
Sample Output
No. 1
1 0 0 0 0 0 0 0
0 0 0 0 0 0 1 0
0 0 0 0 1 0 0 0
0 0 0 0 0 0 0 1
0 1 0 0 0 0 0 0
0 0 0 1 0 0 0 0
0 0 0 0 0 1 0 0
0 0 1 0 0 0 0 0
No. 2
1 0 0 0 0 0 0 0
0 0 0 0 0 0 1 0
0 0 0 1 0 0 0 0
0 0 0 0 0 1 0 0
0 0 0 0 0 0 0 1
0 1 0 0 0 0 0 0
0 0 0 0 1 0 0 0
0 0 1 0 0 0 0 0
No. 3
1 0 0 0 0 0 0 0
0 0 0 0 0 1 0 0
0 0 0 0 0 0 0 1
0 0 1 0 0 0 0 0
0 0 0 0 0 0 1 0
0 0 0 1 0 0 0 0
0 1 0 0 0 0 0 0
0 0 0 0 1 0 0 0
No. 4
1 0 0 0 0 0 0 0
0 0 0 0 1 0 0 0
0 0 0 0 0 0 0 1
0 0 0 0 0 1 0 0
0 0 1 0 0 0 0 0
0 0 0 0 0 0 1 0
0 1 0 0 0 0 0 0
0 0 0 1 0 0 0 0
No. 5
0 0 0 0 0 1 0 0
1 0 0 0 0 0 0 0
0 0 0 0 1 0 0 0
0 1 0 0 0 0 0 0
0 0 0 0 0 0 0 1
0 0 1 0 0 0 0 0
0 0 0 0 0 0 1 0
0 0 0 1 0 0 0 0
No. 6
0 0 0 1 0 0 0 0
1 0 0 0 0 0 0 0
0 0 0 0 1 0 0 0
0 0 0 0 0 0 0 1
0 1 0 0 0 0 0 0
0 0 0 0 0 0 1 0
0 0 1 0 0 0 0 0
0 0 0 0 0 1 0 0
No. 7
0 0 0 0 1 0 0 0
1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 1
0 0 0 1 0 0 0 0
0 1 0 0 0 0 0 0
0 0 0 0 0 0 1 0
0 0 1 0 0 0 0 0
0 0 0 0 0 1 0 0
No. 8
0 0 1 0 0 0 0 0
1 0 0 0 0 0 0 0
0 0 0 0 0 0 1 0
0 0 0 0 1 0 0 0
0 0 0 0 0 0 0 1
0 1 0 0 0 0 0 0
0 0 0 1 0 0 0 0
0 0 0 0 0 1 0 0
No. 9
0 0 0 0 1 0 0 0
1 0 0 0 0 0 0 0
0 0 0 1 0 0 0 0
0 0 0 0 0 1 0 0
0 0 0 0 0 0 0 1
0 1 0 0 0 0 0 0
0 0 0 0 0 0 1 0
0 0 1 0 0 0 0 0
…以下省略
Hint
此题可使用函数递归调用的方法求解。
my code:(其实就是修改了下输入输出)
#include<iostream>
#include<cstdio>
#include<math.h>
#include<stdlib.h>
using namespace std;
int N;
int a[101];
int b[101][101];//用来存放放好的皇后的位置,最左上角是(0,0)
int cnt=1;
void Nqueen(int k) {//在0~k-1列已经摆好的情况下,摆放k列及其后的皇后
if(k==N){
//freopen("C:\\Users\\saS\\Desktop\\666.txt","a",stdout);
cout<<"No. "<<cnt<<endl;
cnt++;
for(int i=0; i<N; i++){
for(int j=0;j<N;j++){
if(j==a[i]){
b[j][i]=1;
}
else{
b[j][i]=0;
}
}
}
for(int i=0;i<N;i++){
for(int j=0;j<N;j++){
if(j!=N-1)
cout<<b[i][j]<<" ";
else
cout<<b[i][j]<<endl;
}
}
// fclose(stdout);
}
for(int i=0; i<N; i++){//逐个尝试第k个皇后的位置
int j;
for(j=0; j<k; j++){
//和已经摆好的k个皇后的位置比较,看是否冲突
if(a[j]==i||abs(a[j]-i)==abs(k-j))
break;//冲突,则下一个位置
}
if(j==k){//当前选的位置i不冲突
a[k]=i;//将第k个皇后放在位置i
Nqueen(k+1);
}
}//for(int i=0;i<N;i++)
return ;
}
int main(){
N=8;
Nqueen(0);//从第0行开始摆放皇后
return 0;
}
八皇后
总Time Limit: 1000ms Memory Limit: 65536kB
Description
会下国际象棋的人都很清楚:皇后可以在横、竖、斜线上不限步数地吃掉其他棋子。如何将8个皇后放在棋盘上(有8 * 8个方格),使它们谁也不能被吃掉!这就是著名的八皇后问题。
对于某个满足要求的8皇后的摆放方法,定义一个皇后串a与之对应,即a=b1b2…b8,其中bi为相应摆法中第i行皇后所处的列数。已经知道8皇后问题一共有92组解(即92个不同的皇后串)。
给出一个数b,要求输出第b个串。串的比较是这样的:皇后串x置于皇后串y之前,当且仅当将x视为整数时比y小。
Input
第1行是测试数据的组数n,后面跟着n行输入。每组测试数据占1行,包括一个正整数b(1 <= b <= 92)
Output
输出有n行,每行输出对应一个输入。输出应是一个正整数,是对应于b的皇后串。
Sample Input
2
1
92
Sample Output
15863724
84136275
#include<iostream>
#include<cstdio>
#include<math.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;
int N;
int a[101];//用来存放放好的皇后的位置,最左上角是(0,0)
int cnt=0;
int b[101]={0};
void Nqueen(int k) {//在0~k-1行已经摆好的情况下,摆放k行及其后的皇后
if(k==N){
for(int i=0; i<N; i++)
b[cnt]=b[cnt]*10+a[i]+1;
cnt++;
}
for(int i=0; i<N; i++){//逐个尝试第k个皇后的位置
int j;
for(j=0; j<k; j++){
//和已经摆好的k个皇后的位置比较,看是否冲突
if(a[j]==i||abs(a[j]-i)==abs(k-j))
break;//冲突,则下一个位置
}
if(j==k){//当前选的位置i不冲突
a[k]=i;//将第k个皇后放在位置i
Nqueen(k+1);
}
}//for(int i=0;i<N;i++)
return ;
}
int main(){
N=8;
int n;
scanf("%d",&n);
Nqueen(0);//从第0行开始摆放皇后
int test;
sort(b,b+101);
int k;
for(int i=0;i<101;i++)
{
if(b[i]!=0)
{
k=i;
break;
}
}
for(int i=0;i<n;i++)
{
scanf("%d",&test);
cout<<b[test+k-1]<<endl;
}
return 0;
}