题目描述:
开关灯,指定四组动作(四个按钮)。问在固定次数的按键情况下能达到要求结果(第几个灯开,第几个灯关)的可能性有哪些。
解题思路:
一开始很哈皮的回溯然后就tle了。后来听同学说只有8种情况,所以就用枚举做。代码不负众望地又写地so冗余了……注意:自己很2地算了7种,忘了不变的情况!wa了半天。
代码:
#include <stdio.h>
#include <stdlib.h>
#define N 101
int lamp[N], num, c, count;
int on[N],off[N], result[9][N], show[9][N];
void test(int x)
{
int f,i;
f = 1;
for(i=1;i<=on[0];i++)
if(result[x][on[i]]==0)
{
f=0;
break;
}
if(1 == f)
for(i=1;i<=off[0];i++)
if(result[x][off[i]]==1)
{
f=0;
break;
}
if(1 == f)
{
count++;
for(i=1;i<=num;i++)
show[count][i] = result[x][i];
}
}
int cmp(const void*a, const void *b)
{
int *a1 =(int*)a,*b1=(int*)b;
int len = num;
int i = 1;
while(i <=len)
{
if(a1[i] != b1[i])
return a1[i]-b1[i];
else
i++;
}
return 0;
}
long long binary(int x)
{
int i = 1;
long long sum = 0;
while(i<=num)
{
sum = sum*2 + show[x][i];