• 扑克序列


    A A 2 2 3 3 4 4, 一共4对扑克牌。请你把它们排成一行。
    要求:两个A中间有1张牌,两个2之间有2张牌,两个3之间有3张牌,两个4之间有4张牌。
    请填写出所有符合要求的排列中,字典序最小的那个。
    例如:22AA3344 比 A2A23344 字典序小。当然,它们都不是满足要求的答案。

    请通过浏览器提交答案。“A”一定不要用小写字母a,也不要用“1”代替。字符间一定不要留空格。
     (15分)

     深搜

    代码:

    #include <iostream>
    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <cmath>
    using namespace std;
    char s[9] = "AA223344",ans[9] = "443322AA",ant[9] = "AA223344";
    int p[5],q[5],visited[5];///每个牌有两张 p记录靠前位置的牌的位置,q记录同一种牌靠后位置的位置,visited记录每种牌访问程度 最多访问两次。
    int check()
    {
        if(q[1] - p[1] != 2)return 0;
        if(q[2] - p[2] != 3)return 0;
        if(q[3] - p[3] != 4)return 0;
        if(q[4] - p[4] != 5)return 0;
        return 1;
    }
    void dfs(int k)
    {
        if(k == 8)
        {
            if(check() && strcmp(ans,ant) > 0)strcpy(ans,ant);
            return;
        }
        for(int i = 1;i <= 4;i ++)
        {
            if(visited[i] != 2)
            {
                visited[i] ++;
                if(i == 1)ant[k] = 'A';
                else ant[k] = i + '0';
                if(visited[i] == 1)p[i] = k;
                else q[i] = k;
                dfs(k + 1);
                visited[i] --;
            }
        }
    }
    int main()
    {
        dfs(0);
        cout<<ans;
    }

     2019备战重做,一共四种卡片,每种两张,不分你我,两张卡片的距离时固定的,所以同时放两张牌。

    代码:

    #include <iostream>
    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #define inf 0x3f3f3f3f
    using namespace std;
    int d[4] = {3,4,5,2};
    bool vis[8];
    char ans[9] = "33221100";
    char t[9] = "00112233";
    void print(char *s) {
        for(int i = 0;i < 8;i ++)
            if(s[i] < '3') putchar(s[i] + 2);
            else putchar('A');
        putchar('
    ');
    }
    void dfs(int k) {
        if(k >= 4) {
            if(strcmp(t,ans) < 0) strcpy(ans,t);
            return;
        }
        for(int i = 0;i < 8;i ++) {
            if(vis[i] || i + d[k] >= 8 || vis[i + d[k]]) continue;
            vis[i] = true;
            vis[i + d[k]] = true;
            t[i] = t[i + d[k]] = '0' + k;
            dfs(k + 1);
            vis[i + d[k]] = false;
            vis[i] = false;
        }
    }
    int main() {
        dfs(0);
        print(ans);
    }
  • 相关阅读:
    ORACLE 数据迁移到SQL SEVER2005的问题
    sql server性能分析检测数据库阻塞语句
    经典存储过程
    sql server性能分析查询死锁的sql语句
    sql server性能分析索引使用效率评估
    discuz!X2.5不改代码即可去掉网址后面的forum.php后缀
    discuz!X2.5伪静态设置
    详解ListView
    frameset、frame和iframe的区别
    android中的Context到底该怎么用
  • 原文地址:https://www.cnblogs.com/8023spz/p/8377948.html
Copyright © 2020-2023  润新知