Codeforces Round #444 (Div. 2) B. Cubes for Masha dfs

QAQ心态崩了……这个题=-=有毒……理解的时候出了点小问题orz(○| ̄|_)

题意大概是输出从1开始可以连续表示的数的最后一个数(n个魔方表示一个数的时候不能重复使用)

注意:0不是一定要有的……从1开始判断就可以了

(因为一开始判断了有没有0……gg了……一直WA)

emmmm这里贴两份代码好了,一份是模拟,另一份……暴力dfs!(看到别人代码才发现原来还可以这样写,代码简洁了好多,开心!o(* ̄▽ ̄*)ブ)

dfs:

#include<string>
#include<iostream>
using namespace std;
int c[5][15];
bool vis[1005], b[5];
int n, a;
void dfs(int p,int s)
{
    vis[s] = 1;    //可以表示数s,emmmm,0就不用管了
    if (p >= n) return; //所用魔方的个数
    for (int i = 1; i <= n; i++)
    {
        if (b[i])continue;  
        for (int j = 0; j < 6; j++)
        {
            b[i] = 1;   //第i个魔方已用过
            dfs(p + 1, s * 10 + c[i][j]);
            b[i] = 0;   //回溯
        }
    }
}
int main()
{
    cin >> n;
    for (int i = 1; i <= n; i++)
        for (int j = 0; j < 6; j++)
            cin >> c[i][j];
    memset(vis, 0, sizeof(vis));
    memset(b, 0, sizeof(b));
    dfs(0, 0);
    int i;
    for (i = 1; i < 1000; i++)
        if (!vis[i]) break;
    cout << i - 1 << endl;
    return 0;
}

模拟:

#include<string>    //orz这就叫,智商不够代码来凑……(○| ̄|_ )
#include<iostream>
using namespace std;
bool c[5][15];
int n, a;
int main()
{
    cin >> n;
    memset(c, 0, sizeof(c));
    for (int i = 1; i <= n; i++)
        for (int j = 0; j < 6; j++)
        {
            cin >> a;
            c[i][a] = 1;
        }
    if (n == 1)
    {
        for (int i = 1; i < 10; i++)
        {
            if (!c[1][i])
            {
                cout << i - 1 << endl;
                return 0;
            }
        }
    }
    if (n == 2)
    {
        for (int i = 1; i < 10; i++)
        {
            int flag = 0;
            if (c[1][i] || c[2][i])
                flag = 1;
            if (!flag)
            {
                cout << i - 1 << endl;
                return 0;
            }
        }
        for (int i = 10; i < 100; i++)
        {
            int flag = 0;
            a = i / 10;
            int b = i % 10;
            if (c[1][a] && c[2][b]) flag = 1;
            if (c[1][b] && c[2][a])flag = 1;
            if (!flag)
            {
                cout << i - 1 << endl;
                return 0;
            }
        }
    }
    if (n == 3)
    {
        for (int i = 1; i < 10; i++)
        {
            if (!c[1][i] && !c[2][i] && !c[3][i])
            {
                cout << i - 1 << endl;
                return 0;
            }
        }
        for (int i = 10; i < 100; i++)
        {
            int flag = 0;
            a = i / 10;
            int b = i % 10;
            if (c[1][a] && c[2][b]) flag = 1;
            else if (c[1][b] && c[2][a])flag = 1;
            else if (c[1][a] && c[3][b]) flag = 1;
            else if (c[1][b] && c[3][a])flag = 1;
            else if (c[2][a] && c[3][b]) flag = 1;
            else if (c[2][b] && c[3][a])flag = 1;
            if (!flag)
            {
                cout << i - 1 << endl;
                return 0;
            }
        }
    }
}
原文地址:https://www.cnblogs.com/Egoist-/p/7784673.html