1 条题解

  • 0
    @ 2025-10-8 16:48:29

    scy视频

    #include<bits/stdc++.h>
    using namespace std;
    int n;         //n表示有n个号码(分别是1~n)
    int a[110];    //a数组表示一排格子,它们以后用来存号码的(a[i]=7表示第i个格子存了号码7)
    bool v[110];   //标记每个号码是否可填,v[i]==0表示号码i可用:可以用来填进格子。 反之不行
    void dfs(int k)//表示当前要做的事情是:第k个格子要找号码来存
    {
        if(k==n+1) //什么?你是第n+1个格子?说明前面n个格子都找到了号码存在各自的格子里
        {
            for(int i=1;i<n;i++) printf("%d ",a[i]);   //输出第1~n个格子各自存的号码
            printf("%d\n",a[n]);
        }
        else
        {
            for(int i=1;i<=n;i++)
               if( v[i]==0 ) // 如果号码i是可用的
               {
                  v[i]=1;    //占用资源:号码i准备存进格子里,设置为该号码已经被使用了(1)
                  a[k]=i;    //占用资源:第k个格子存进号码i,
                  dfs(k+1);  //下一个格子(k+1)叫停,说轮到它找号码存了
                  a[k]=0;    //释放资源:第k个格子踢走了存在自己里面的号码
                  v[i]=0;    //释放资源:号码i被踢后,设置自己为可用,方便后面有格子找号码           
               }
        }
    }
    int main()
    {
        scanf("%d", &n);
        memset(v, 0, sizeof(v)); //就是把v数组全部变成 0(初始化)
        dfs(1);                //从第1个格子开始找号码存
        return 0;
    }
    
    • 1

    信息

    ID
    44
    时间
    1000ms
    内存
    128MiB
    难度
    7
    标签
    递交数
    835
    已通过
    162
    上传者