1. 程式人生 > 實用技巧 >DFS & BFS【搜尋】

DFS & BFS【搜尋】

DFS模板

void dfs(int depth)//depth表示當前的層數(或深度)
{
    if(depth>n)//到達葉子節點,該路已走到盡頭
        return;
    for(int i=1;i<=n;i++)//n表示最大的值,即最大深度為n
    {
        if(b[i]==0)//b陣列表示探索的狀態,1表示已被探索,0表示尚未被探索
        {
            b[i]=1;//標記當前的b[i]已被探索
            a[level]=i;//記錄當前的節點值
            dfs(level+1);//進一步的搜尋
            b[i]=0
;//還原當前的b[i]元素被探索的狀態 } } }

全排列問題

題目描述

排列與組合是常用的數學方法。
先給一個正整數 ( 1 < = n < = 10 )
例如n=3,所有組合,並且按字典序輸出:
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1

輸入

輸入一個整數n( 1<=n<=10)

輸出

輸出所有全排列

每個全排列一行,相鄰兩個數用空格隔開(最後一個數後面沒有空格)

樣例輸入Copy

3

樣例輸出Copy

1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
#include<bits/stdc++.h>
#include<queue>
using namespace std;
const int N=100;
typedef long long ll;
int n,a[10010],b[10010];
void print()
{
    for(int i=1;i<=n;i++)
    {
        printf("%5d",a[i]);
    }
    cout<<endl;
}
void dfs(int level)
{
    if(level==n+1)
    {
        print();
        
return; } for(int i=1;i<=n;i++) { if(b[i]==0) { b[i]=1; a[level]=i; dfs(level+1); b[i]=0; } } } int main() { cin>>n; dfs(1); }

n皇后問題

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n,y[100010],s,ans[100010];
bool check(int x)//剪枝,判斷兩點的位置\\
兩點的斜率的絕對值不得等於1;兩點不得在同一水平線上(包括同一行和同一列)
{
    for(int i=1;i<x;i++)//i本身就是指行號,y[i]表示對應的列號
    {
        if(abs(x-i)==abs(y[x]-y[i])||y[x]==y[i]||x==i)
        {
            return 0;
        }
    }
    return 1;
}
void dfs(int num)
{
    if(num>n)//越界處理
    {
        s++;
        return;
    }
    for(int i=1;i<=n;i++)
    {
        y[num]=i;//將當前的行號賦值給第num個皇后
        if(check(num))
            dfs(num+1);//進行下一步的搜尋
    }
}
int main()
{
    for(int i=1;i<=10;i++)
    {
        n=i;
        s=0;
        dfs(1);
        ans[i]=s;
    }
    while(~scanf("%d",&n)&&n)
        printf("%d\n",ans[n]);
}