DFS:P1157 组合的输出(洛谷)

    技术2026-04-04  7

    本题链接: 组合的输出 经典的深度搜索题。 深度搜索全排列模板:

    //全排列问题 #include<bits/stdc++.h> using namespace std; int n; char a[15]; char re[15]; int vis[15]; void dfs(int step) { int i; if(step==n+1)//判断边界 { for(i=1;i<=n;i++) printf("%c",re[i]); return ; } for(i=1;i<=n;i++)//遍历每一种情况 { if(vis[i]==0)//check满足 { re[step]=a[i]; vis[i]=1;//标记 dfs(step+1);//继续搜索 vis[i]=0;//恢复初始状态 } } return ; } int main(void) { dfs(1) ; return 0; }

    本题代码思路和上述代码差不多,但要加入判断条件。

    #include<bits/stdc++.h> using namespace std; int a[101], b[101], n,r; void print() { int i; for (i = 1; i <= r; i++) { cout <<setw(3)<< a[i]; } cout << endl; } inline void dfs(int i) { int j; if (i > r) { print(); return; } for (j = 1; j <= n; j++) { if (b[j] == 0&&j>a[i-1]||i==1)//加入判断条件 { a[i] = j; b[j] = 1; dfs(i + 1); b[j] = 0; } } } int main() { cin >> n>>r; dfs(1); return 0; }

    核心代码:

    for (j = 1; j <= n; j++) { if (b[j] == 0&&j>a[i-1]||i==1)//加入判断条件 { a[i] = j; b[j] = 1; dfs(i + 1); b[j] = 0; } } }
    Processed: 0.008, SQL: 9