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;
}

最近集訓隊裏的隊伍都陸陸續續比賽完了,有好有壞,我都不知道我能不能堅持下來。。。


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