zoukankan      html  css  js  c++  java
  • 蓝桥杯

    今有7对数字:两个1,两个2,两个3,...两个7,把它们排成一行。
    要求,两个1间有1个其它数字,两个2间有2个其它数字,以此类推,两个7之间有7个其它数字。如下就是一个符合要求的排列:

    17126425374635

    当然,如果把它倒过来,也是符合要求的。

    请你找出另一种符合要求的排列法,并且这个排列法是以74开头的。

    注意:只填写这个14位的整数,不能填写任何多余的内容,比如说明注释等。

    答案:

    74151643752362

    解法1:

    按照n=1~7进行DFS:我们每次尝试在当前存在的若干空位中放入n,如果可以放入,就往下搜索n+1;

    代码:

    #include<bits/stdc++.h>
    using namespace std;
    int num[15]={0,7,4,0,0,0,0,4,0,7,0,0,0,0,0};
    void dfs(int n)
    {
        if(n==4) dfs(n+1);
        if(n==7)
        {
            for(int i=1;i<=14;i++) printf("%d",num[i]); printf("
    ");
            return;
        }
    
        for(int i=1;i<=14;i++)
        {
            if(i==1 || i==2 || i==7 || i==9) continue;
            int bak=i+n+1;
            if(bak>14) continue;
    
            if(num[i]==0 && num[bak]==0)
            {
                num[i]=num[bak]=n;
                dfs(n+1);
                num[i]=num[bak]=0;
            }
        }
    }
    int main()
    {
        dfs(1);
    }

    解法2:

    按照pos=1~14进行DFS:我们每次暴力枚举要放入数字i = 1~7,如果 i 还未放入,就尝试在当前的空位pos和pos+i+1中放入i,如果可以放入,就往下搜索pos+1;

    代码:

    #include<bits/stdc++.h>
    using namespace std;
    int num[15]={0,7,4,0,0,0,0,4,0,7,0,0,0,0,0};
    bool vis[8];
    void dfs(int pos)
    {
        if(num[pos]) dfs(pos+1);
        if(pos==15)
        {
            for(int i=1;i<=14;i++) printf("%d",num[i]); printf("
    ");
            return;
        }
    
        for(int i=1;i<=7;i++)
        {
            if(vis[i]) continue;
            int bak=pos+i+1;
            if(bak>14) continue;
            if(num[pos]==0 && num[bak]==0)
            {
                num[pos]=num[bak]=i; vis[i]=1;
                dfs(pos+1);
                num[pos]=num[bak]=0; vis[i]=0;
            }
        }
    }
    int main()
    {
        memset(vis,0,sizeof(vis));
        vis[4]=vis[7]=1;
        dfs(1);
    }
  • 相关阅读:
    MVP社区巡讲照片集
    周末之个人杂想(十六)
    SQL Server 2014 BI新特性(二)结合Data Explorer和GeoFlow进行数据分析
    SQL Server 2014 BI新特性(一)五个关键点带你了解Excel下的Data Explorer
    Tabular Model下的ADOMD.NET
    玩玩Excel下的Power View
    LeakCanary,30分钟从入门到精通
    Android热修复技术总结
    阿里最新热修复Sophix与QQ超级补丁和Tinker的实现与总结
    热修复——深入浅出原理与实现
  • 原文地址:https://www.cnblogs.com/dilthey/p/8653810.html
Copyright © 2011-2022 走看看