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

 最近课程越来越紧了,只能将刷题时间压缩了,至少每日一题吧~ 今天第一天

这道题。。。首先看题没看太懂。。虽然字很少

题目意思: 就是说 给你n个色子,上面6个数,数的范围是0~9,然后下面是n行,就是每个色子面上的数。

然后要求从1开始到x,求x的最大值,这个x是用每个色子面上的数组合成的,但是在组成一个数时每个色子只能用一次。

思路: 我用的搜索,DFS,利用DFS去找到可以组成的任何数,然后遍历一次,在哪里断掉了(就是这个数没有出现过),那就最大能组成这个数

#include <cstring>
#include <cstdio>
using namespace std;
int n;
int vis[1000],bi[5];  // 这个bi用于时时标记这个数是否已经被访问
int nums[5][9];
void DFS(int ceng,int s)
{
    vis[s]=1;   // 最后根据这个来判断
    if(ceng>=n)return ;
    for(int i=1;i<=n;i++)
    {
        if(bi[i])continue ;  //  如果这个魔方已经用过了
        for(int j=0;j<6;j++)
        {
            bi[i]=1;  // 标记已经用过
            DFS(ceng+1,s*10+nums[i][j]);
            bi[i]=0; // 回溯处理
        }
    }
}
int main()
{
    while(~scanf("%d",&n))
    {
        memset(vis,0, sizeof(vis));
        memset(bi,0, sizeof(bi));
        for(int i=1;i<=n;i++)
            for(int j=0;j<6;j++)
                scanf("%d",&nums[i][j]);
        DFS(0,0);
        int i;
        for(i=1;i<1000;i++)
            if(!vis[i])
                break;
        printf("%d\n",i-1);
    }
    return 0;
}

最近集训队里的队伍都陆陆续续比赛完了,有好有坏,我都不知道我能不能坚持下来。。。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章