题解 P1706 【全排列问题】

· · 题解

本题解绝非正解,仅适用于初学者,没有涉及DFS及其他高端技术,会枚举就能看懂。求大佬勿喷。

咱是个蒟蒻,咱不会DFS,也不会高端做法,打表费时,所以,暴力枚举出奇迹!(逃)

其实就是枚举所有数字,反正就1-9,范围小,打表也可以,但表会分行,这时候要么在表里行前行尾加“”然后用printf("...""..."......)输出,要么用C11里的raw string literals,cout<<R"..."输出。咱都用不熟咋治?

枚举呗

枚举思想很简单,n最大是9,那就用9个for循环分别枚举,从1-n,只输出1-n的全排序,那就每个循环后面加个判断语句,看是否到第n个数了,到了的话直接输出。

下面是代码,代码很长,但很好打,各部分都差不多,写的时候复制一部分黏贴,在后面加一段就行

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int a[10];
    for(int i=1;i<=9;i++) a[i]=i;
    int n;
    cin>>n;
    for(int i1=1;i1<=n;i1++)//把第一个数从1-n枚举 
    {
        if(n==1)//如果n是1,即从1-1全排序 
        {
            cout<<"    "<<i1<<"\n" //输出全排序结果 
            continue;//跳过后面几个数的枚举
        }
        for(int i2=1;i2<=n;i2++)//把第二个数从1-n枚举 ,后面嵌套的for循环同理,即把第3、4、5...9个数枚举 
        {
            if(i2==i1) continue;//当i2和前面的数重复时,跳过后面的判断,继续循环。后面嵌套的循环同理,即当i3、i4、i5、......i9和前面数重复时,跳过后面的判断,继续循环 
            if(n==2)//如果n是2 ,即从1-2全排序。后面同理,即从1-3、1-4......1-9全排序 
            {
                cout<<"    "<<i1<<"    "<<i2<<"\n";//输出全排序结果,后面同理 
                continue;//跳过后面几个数的枚举,后面同理 
            }
            for(int i3=1;i3<=n;i3++)
            {
                if(i3==i2||i3==i1) continue;
                if(n==3)
                {
                    cout<<"    "<<i1<<"    "<<i2<<"    "<<i3<<"\n";
                    continue;
                }
                for(int i4=1;i4<=n;i4++)
                {
                    if(i4==i3||i4==i2||i4==i1) continue;
                    if(n==4)
                    {
                        cout<<"    "<<i1<<"    "<<i2<<"    "<<i3<<"    "<<i4<<"\n";
                        continue;
                    }
                    for(int i5=1;i5<=n;i5++)
                    {
                        if(i5==i4||i5==i3||i5==i2||i5==i1) continue;
                        if(n==5)
                        {
                            cout<<"    "<<i1<<"    "<<i2<<"    "<<i3<<"    "<<i4<<"    "<<i5<<"\n";
                            continue;
                        }
                        for(int i6=1;i6<=n;i6++)
                        {
                            if(i6==i5||i6==i4||i6==i3||i6==i2||i6==i1) continue;
                            if(n==6)
                            {
                                cout<<"    "<<i1<<"    "<<i2<<"    "<<i3<<"    "<<i4<<"    "<<i5<<"    "<<i6<<"\n";
                                continue;
                            }
                            for(int i7=1;i7<=n;i7++)
                            {
                                if(i7==i6||i7==i5||i7==i4||i7==i3||i7==i2||i7==i1) continue;
                                if(n==7)
                                {
                                    cout<<"    "<<i1<<"    "<<i2<<"    "<<i3<<"    "<<i4<<"    "<<i5<<"    "<<i6<<"    "<<i7<<"\n";
                                    continue;
                                }
                                for(int i8=1;i8<=n;i8++)
                                {
                                    if(i8==i7||i8==i6||i8==i5||i8==i4||i8==i3||i8==i2||i8==i1) continue;
                                    if(n==8)
                                    {
                                        cout<<"    "<<i1<<"    "<<i2<<"    "<<i3<<"    "<<i4<<"    "<<i5<<"    "<<i6<<"    "<<i7<<"    "<<i8<<"\n";
                                        continue;   
                                    }   
                                    for(int i9=n;i9<=n;i9++)
                                    {
                                        if(i9==i8||i9==i7||i9==i6||i9==i5||i9==i4||i9==i3||i9==i2||i9==i1) continue;
                                        cout<<"    "<<i1<<"    "<<i2<<"    "<<i3<<"    "<<i4<<"    "<<i5<<"    "<<i6<<"    "<<i7<<"    "<<i8<<"    "<<i9<<"\n";
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    return 0;
}