A、水题,找到小数点即可。
B、水题,注意判断所有值的和是否能够整除n。
C、直接DFS出所有的排列,找出每种排列之后把所有旋转的情况全部标记一遍,生成每种排列后看看是否之前出现过即可。
附上一个写的很挫的代码
#include <stdio.h>
bool map[10000000];
char str[6];
int ret;
int vis[6];
char hash[6]={'R','O','Y','G','B','V'};
int ev[1000];
void Vis(int t)
{
int now[10];
int cas,i,j,k,up,T,l,p;
T=t;
cas=0;
for (i=0;i<4;i++)
{
up=6;
for (k=1;k<=6;k++)
{
now[up--]=t%10;
t/=10;
}
t=0;
for (j=1;j<=6;j++)
{
if (j==1 || j==6) t=t*10+now[j];
else if (j>2) t=t*10+now[j-1];
if (j==2) t=t*10+now[5];
}
ev[cas++]=t;
map[t]=1;
}
t=T;
p=cas;
for (l=0;l<p;l++)
{
t=ev[l];
for (i=0;i<4;i++)
{
up=6;
for (k=1;k<=6;k++)
{
now[up--]=t%10;
t/=10;
}
t=0;
for (j=1;j<=6;j++)
{
if (j==2 || j==4) t=t*10+now[j];
if (j==1) t=t*10+now[5];
if (j==3) t=t*10+now[1];
if (j==5) t=t*10+now[6];
if (j==6) t=t*10+now[3];
}
map[t]=1;
ev[cas++]=t;
}
}
p=cas;
t=T;
for (l=0;l<p;l++)
{
t=ev[l];
for (i=0;i<4;i++)
{
up=6;
for (k=1;k<=6;k++)
{
now[up--]=t%10;
t/=10;
}
t=0;
for (j=1;j<=6;j++)
{
if (j==3 || j==5) t=t*10+now[j];
if (j==1) t=t*10+now[4];
if (j==2) t=t*10+now[1];
if (j==4) t=t*10+now[6];
if (j==6) t=t*10+now[2];
}
map[t]=1;
}
}
}
void DFS(int len,int val)
{
// printf("%d..%d\n",len,val);
int i,j,x;
if (len==6)
{
if (map[val]==1) return;
Vis(val);
// printf("%d\n",val);
ret++;
}
for (i=0;i<6;i++)
{
if (vis[i]!=1)
{
vis[i]=1;
for (j=0;j<6;j++)
{
if (hash[j]==str[i])
{
x=j+1;
break;
}
}
DFS(len+1,val*10+x);
vis[i]=0;
}
}
}
int main()
{
int i,j,n;
scanf("%s",str);
ret=0;
DFS(0,0);
printf("%d\n",ret);
return 0;
}
后面两题基本上就没人出了……第三题做完就玩去了……orz……