//dfs全排列
#include<iostream>
#include<vector>
using namespace std;
const int maxn=110;
vector<int> path;
int n;
int vis[maxn]={0};
int num[maxn];
void print(){
for(int i=1;i<=n;i++){
cout<<num[i];
}
cout<<endl;
}
void dfs(int deep){
if(deep>n) print();
else{
for(int i=1;i<=n;i++){
if(vis[i]==0){
vis[i]=1;
num[deep]=i;
dfs(deep+1);
vis[i]=0;
}
}
}
}
int main(){
cin>>n;
fill(vis,vis+n+1,0);
dfs(1);
return 0;
}
//dfs组合数
#include<iostream>
#include<vector>
using namespace std;
const int maxn=110;
vector<int> path;
int n,r;
int vis[maxn]={0};
int num[maxn];
void print(){
for(int i=1;i<=r;i++){
cout<<num[i];
}
cout<<endl;
}
void dfs(int deep){
if(deep>r) print();
else{
for(int i=1;i<=n;i++){
if(vis[i]==0){
vis[i]=1;
num[deep]=i;
dfs(deep+1);
vis[i]=0;
}
}
}
}
int main(){
cin>>n>>r;
fill(vis,vis+n+1,0);
dfs(1);
return 0;
}
//dfs组合数,要求递增
#include<iostream>
#include<vector>
using namespace std;
const int maxn=110;
vector<int> path;
int n,r;
int vis[maxn]={0};
int num[maxn];
void print(){
for(int i=1;i<=r;i++){
cout<<num[i];
}
cout<<endl;
}
void dfs(int deep){
if(deep>r) print();
else{
for(int i=1;i<=n;i++){
if(vis[i]==0){
if(deep>1){
if(i>num[deep-1]){
vis[i]=1;
num[deep]=i;
dfs(deep+1);
vis[i]=0;
}
}
else{
vis[i]=1;
num[deep]=i;
dfs(deep+1);
vis[i]=0;
}
}
}
}
}
int main(){
cin>>n>>r;
fill(vis,vis+n+1,0);
dfs(1);
return 0;
}
问题 D: 【递归入门】n皇后 问题(原始的8皇后问题)
时间限制: 1 Sec 内存限制: 128 MB
提交: 55 解决: 38
[提交][状态][TK题库][命题人:]
题目描述
会下国际象棋的人都很清楚:皇后可以在横、竖、斜线上不限步数地吃掉其他棋子。如何将8个皇后放在棋盘上(有8 * 8个方格),使它们谁也不能被吃掉!这就是著名的八皇后问题。
输入
一个整数n( 1 < = n < = 10 )
输出
每行输出对应一种方案,按字典序输出所有方案。每种方案顺序输出皇后所在的列号,相邻两数之间用空格隔开。如果一组可行方案都没有,输出“no solute!”
样例输入
4
样例输出
2 4 1 3
3 1 4 2
//n皇后问题,相当于dfs全排列,不过多了判断条件
#include<iostream>
#include<vector>
using namespace std;
int num[110];
int vis[110]={0};
int qipan[110][110];
int n;
void print(){
for(int i=1;i<=n;i++){
cout<<num[i];
}
cout<<endl;
}
bool value(int lie,int hang){
if(qipan[hang][lie]==0) return true;
else return false;
}
void deal(int lie,int hang,int a){
int i,j;
for(i=1;i<=n;i++){
if(qipan[i][lie]==0) qipan[i][lie]=a;
}
for(i=1;i<=n;i++){
if(qipan[hang][i]==0) qipan[hang][i]=a;
}
for(i=hang+1,j=lie-1;i<=n&&j>=1;i++,j--){//左上
if(qipan[i][j]==0) qipan[i][j]=a;
}
for(i=hang-1,j=lie-1;i>=1&&j>=1;i--,j--){//左下
if(qipan[i][j]==0) qipan[i][j]=a;
}
for(i=hang+1,j=lie+1;i<=n&&j<=n;i++,j++){//右上
if(qipan[i][j]==0) qipan[i][j]=a;
}
for(i=hang-1,j=lie+1;i>=1&&j<=n;i--,j++){//右下
if(qipan[i][j]==0) qipan[i][j]=a;
}
}
void recover(int lie,int hang,int a){
int i,j;
for(i=1;i<=n;i++){
if(qipan[hang][i]==a) qipan[hang][i]=0;
}
for(i=1;i<=n;i++){
if(qipan[i][lie]==a) qipan[i][lie]=0;
}
for(i=hang+1,j=lie-1;i<=n&&j>=1;i++,j--){//左上
if(qipan[i][j]==a) qipan[i][j]=0;
}
for(i=hang-1,j=lie-1;i>=1&&j>=1;i--,j--){//左下
if(qipan[i][j]==a) qipan[i][j]=0;
}
for(i=hang+1,j=lie+1;i<=n&&j<=n;i++,j++){//右上
if(qipan[i][j]==a) qipan[i][j]=0;
}
for(i=hang-1,j=lie+1;i>=1&&j<=n;i--,j++){//右下
if(qipan[i][j]==a) qipan[i][j]=0;
}
}
void dfs(int deep){
if(deep>n) print();
else{
for(int i=1;i<=n;i++){
if(value(i,deep)){
//vis[i]=1;
deal(i,deep,i);//i是列,deep是行
num[deep]=i;
dfs(deep+1);
//vis[i]=0;
recover(i,deep,i);
}
}
}
}
int main(){
cin>>n;
dfs(1);
}
//输出全部8皇后序列,一共92组
#include<stdio.h>
#include<vector>
using namespace std;
int qipan[9][9]={0};
int num=0;
int tmp[10];
vector<int> path[100];
void print(){
for(int i=1;i<=8;i++){
path[num].push_back(tmp[i]);
}
}
void deal(int x,int y){
int i,j;
qipan[x][y]=y;//被占领
for(j=1;j<=8;j++){//所在行
if(qipan[x][j]==0) qipan[x][j]=y;
}
for(i=1;i<=8;i++){//列
if(qipan[i][y]==0) qipan[i][y]=y;
}
for(i=x,j=y;i>=1&&j>=1;i--,j--){//左下
if(qipan[i][j]==0) qipan[i][j]=y;
}
for(i=x,j=y;i<=8&&j>=1;i++,j--){//左上
if(qipan[i][j]==0) qipan[i][j]=y;
}
for(i=x,j=y;i>=1&&j<=8;i--,j++){//右下
if(qipan[i][j]==0) qipan[i][j]=y;
}
for(i=x,j=y;i<=8&&j<=8;i++,j++){//右上
if(qipan[i][j]==0) qipan[i][j]=y;
}
}
void huifu(int x,int y){
qipan[x][y]=0;
for(int i=1;i<=8;i++){
for(int j=1;j<=8;j++){
if(qipan[i][j]==y) qipan[i][j]=0;
}
}
}
void dfs(int deep){//deep相当于行
if(deep>8){
print();
num++;
return;
}
for(int i=1;i<=8;i++){
if(qipan[deep][i]==0){
deal(deep,i);
tmp[deep]=i;
dfs(deep+1);
huifu(deep,i);
}
}
}
int main(){
int deep=1;
dfs(deep);
int n;
scanf("%d",&n);
for(int j=0;j<8;j++){
printf("%d",path[n-1][j]);
}
/*for(int i=0;i<num;i++){
for(int j=0;j<8;j++){
printf("%d",path[i][j]);
}
printf("\n");
}*/
return 0;
}
//统计出栈序列数:(2n)!/(n+1)!/n!
#include<iostream>
#include<stack>
using namespace std;
int n;
int num=0;
//q存放入栈序列,stk模拟入栈过程,output存放出栈序列
void print(stack<int> s){
while(!s.empty()){
cout<<s.top()<<" ";
s.pop();
}
cout<<endl;
num++;
return;
}
void pupo(stack<int> q,stack<int> stk,stack<int> output){
if((q.size()==0)&&(stk.size()==0)&&(output.size()==n)){
print(output);
return;
}
if(!q.empty()){
int p=q.top();
stk.push(p);
q.pop();
pupo(q,stk,output);
stk.pop();
q.push(p);
}
if(!stk.empty()){
int p=stk.top();
output.push(p);
stk.pop();
pupo(q,stk,output);
output.pop();
stk.push(p);
}
return;
}
int main(){
cin>>n;
stack<int> q,stk,output;
for(int i=1;i<=n;i++){
q.push(i);
}
pupo(q,stk,output);
cout<<num;
}