第三章 搜索与图论

2021-04-10  本文已影响0人  burningrain

AcWing 842. 排列数字
给定一个整数n,将数字1到n排成一排,将会有很多种排列方法。

现在,请你按照字典序将所有的排列方法输出。

输入格式
共一行,包含一个整数n

输出格式
按字典序输出所有排列方案,每个方案占一行。

数据范围
1≤n≤7
输入样例:
3
输出样例:
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
代码:

#include<bits/stdc++.h>
using namespace std;
int vis[10];
int n;
int path[10];
void dfs(int u){
    if(u==n){
        for(int i=0;i<n;i++){
            cout<<path[i]<<" ";
        }cout<<endl;
        return;
    }
    for(int i=1;i<=n;i++){
          if(!vis[i]){
              path[u]=i;
              vis[i]=1;
              dfs(u+1);
              path[u]=0;
              vis[i]=0;
          }
    }
}
int main(){
    cin>>n;
    dfs(0);
    return 0;
}
#include<bits/stdc++.h>
using namespace std;
int n;
int a[10];
void dfs(int low,int hight){
    if(low==hight){
        for(int i=1;i<=n;i++){
            cout<<a[i]<<" ";
        }cout<<endl;
    }
    int x=0;
    for(int i=low;i<=hight;i++){
        x=a[low];
        a[low]=a[i];
        a[i]=x;
        dfs(low+1,hight);   
        x=a[low];
        a[low]=a[i];
        a[i]=x;
    }
}

int main(){
    cin>>n;
    for(int i=1;i<=n;i++){a[i]=i;}
    dfs(1,n);
    return 0;
}
#include<bits/stdc++.h>
using namespace std;
int n;
int a[10];
int main(){
    cin>>n;
    for(int i=1;i<=n;i++){a[i]=i;}
    do{
        for(int i=1;i<=n;i++){
            cout<<a[i]<<" ";
        }cout<<endl;
    }while(next_permutation(a+1,a+1+n));
    return 0;
}

843. n-皇后问题

#include<bits/stdc++.h>
using namespace std;
int n;
int col[100],gd[200],ugd[200];
char g[100][100];
void dfs(int x){
    if(x==n){
        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                cout<<g[i][j];
            }
            cout<<endl;
        }
        cout<<endl;
        return;
    }
    for(int y=0;y<n;y++){
        if(!col[y]&&!gd[x+y]&&!ugd[y-x+n]){
            col[y]=gd[x+y]=ugd[y-x+n]=1;
            g[x][y]='Q';
            dfs(x+1);
            col[y]=gd[x+y]=ugd[y-x+n]=0;
            g[x][y]='.';
        }
    }
}
int main(){
    cin>>n;
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            g[i][j]='.';
        }
    }
    dfs(0);
    return 0;
}

AcWing 844. 走迷宫
给定一个n*m的二维整数数组,用来表示一个迷宫,数组中只包含01,其中0表示可以走的路,1表示不可通过的墙壁。

最初,有一个人位于左上角(1, 1)处,已知该人每次可以向上、下、左、右任意一个方向移动一个位置。

请问,该人从左上角移动至右下角(n, m)处,至少需要移动多少次。

数据保证(1, 1)处和(n, m)处的数字为0,且一定至少存在一条通路。

输入格式

第一行包含两个整数n和m。

接下来n行,每行包含m个整数(0或1),表示完整的二维数组迷宫。

输出格式

输出一个整数,表示从左上角移动至右下角的最少移动次数。

数据范围

1≤n,m≤100

输入样例:

5 5
0 1 0 0 0
0 1 0 1 0
0 0 0 0 0
0 1 1 1 0
0 0 0 1 0

输出样例:

8

上一篇下一篇

猜你喜欢

热点阅读