洛谷P1706 全排列问题

#先看题目

题目描述

按照字典序输出自然数 1 到 n 所有不重复的排列,即 n 的全排列,要求所产生的任一数字序列中不允许出现重复的数字。

输入格式

一个整数 n。

输出格式

由1∼n 组成的所有不重复的数字序列,每行一个序列。

每个数字保留 5 个场宽。

输入输出样例

输入 #1

3

输出 #1

    1    2    3
    1    3    2
    2    1    3
    2    3    1
    3    1    2
    3    2    1

说明/提示

1≤n≤9。

 题目链接icon-default.png?t=N7T8https://www.luogu.com.cn/problem/P1706?contestId=154347

#思路

搜索部分 

1、先从每一个数的第一位开始枚举一直枚举到最后一位:

for(i=1;i<=g;i++)
    if(a[i]==0)
    {
        b[k+1]=i;
        s(k+1);
    }

2、标记用过的数,并在搜索完以后回溯:

for(i=1;i<=g;i++)
    if(a[i]==0)
    {
        a[i]=1;
        b[k+1]=i;
        s(k+1);
        a[i]=0;
    }

3、如果填完一个数就输出:

    if(k==g)
    {
        print();
        return;
    }

所以搜索部分可以这样写:

void s(int k)
{
    int i;
    if(k==g)
    {
        print();
        return;
    }
    for(i=1;i<=g;i++)
        if(a[i]==0)
        {
            a[i]=1;
            b[k+1]=i;
            s(k+1);
            a[i]=0;
        }
}

 

输出部分

输出时要每个数字保留 5个场宽:

void print()
{
    int i;
    for(i=1;i<=g;i++)cout<<"    "<

也可以这样写:

cout<

主程序

int main()
{
    cin>>g;
    s(0);
    return 0;
}

#最后附上完整代码

#include
using namespace std;
int g,a[100],b[100];
void print()
{
    int i;
    for(i=1;i<=g;i++)cout<<"    "<>g;
    s(0);
    return 0;
}

你可能感兴趣的:(算法)