最近課程越來越緊了,只能將刷題時間壓縮了,至少每日一題吧~ 今天第一天
這道題。。。首先看題沒看太懂。。雖然字很少
題目意思: 就是說 給你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;
}
最近集訓隊裏的隊伍都陸陸續續比賽完了,有好有壞,我都不知道我能不能堅持下來。。。