扑克序列

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);
}
原文地址:https://www.cnblogs.com/8023spz/p/8377948.html