最近课程越来越紧了,只能将刷题时间压缩了,至少每日一题吧~ 今天第一天
这道题。。。首先看题没看太懂。。虽然字很少
题目意思: 就是说 给你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;
}
最近集训队里的队伍都陆陆续续比赛完了,有好有坏,我都不知道我能不能坚持下来。。。