【C】DFS专题(二)

//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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值