poj_1176_枚举

来源:互联网 发布:淘宝手机端首页模版 编辑:程序博客网 时间:2024/06/07 00:09

题目描述:

  开关灯,指定四组动作(四个按钮)。问在固定次数的按键情况下能达到要求结果(第几个灯开,第几个灯关)的可能性有哪些。

 

解题思路:

   一开始很哈皮的回溯然后就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];
     i++;
   }
   return sum;
}

main()
{
   int i,j,tmp;
   long long tmp1,tmp2;
  
  scanf("%d",&num);
  scanf("%d",&c);
  scanf("%d",&tmp);
   i=0;
   while(tmp!=-1)
   {
     i++;
     on[i]=tmp;
     scanf("%d",&tmp);
   }
   on[0] = i;
  
  scanf("%d",&tmp);
   i=0;
   while(tmp!=-1)
   {
     i++;
     off[i]=tmp;
     scanf("%d",&tmp);
   }
   off[0] = i;
  
  for(i=1;i<=num;i++)
     lamp[i] = 1;
  
   //枚举8种结果!
  for(i=1;i<=num;i++)
     result[1][i] = 1-lamp[i];
  for(i=1;i<=num;i++)
   {
     if(i%2 != 0)
        result[2][i] = 1-lamp[i];
     else
        result[2][i] = lamp[i];
   }
  for(i=1;i<=num;i++)
   {
     if(i%2 == 0)
        result[3][i] = 1-lamp[i];
     else
        result[3][i] = lamp[i];
   }
  for(i=1;i<=num;i++)
   {
     if(i%3 == 1)
        result[4][i] = 1-lamp[i];
     else
        result[4][i] = lamp[i];
   }
  for(i=1;i<=num;i++)//1+4
     result[5][i] = 1-result[4][i];
  for(i=1;i<=num;i++)//2+4
   {
      if(i%2!=0)
         result[6][i] = 1-result[4][i];
      else
         result[6][i] = result[4][i];
   }
  for(i=1;i<=num;i++)//3+4
   {
      if(i%2==0)
         result[7][i] = 1-result[4][i];
      else
         result[7][i] = result[4][i];
   }
  for(i=1;i<=num;i++)
     result[8][i] = lamp[i];
  
   //test 7中结果里符合条件的有几种
   count = 0;
   if(c>2)
     for(i=1;i<=8;i++)
        test(i);
   else if(c==1)
     for(i=1;i<=4;i++)
        test(i);
   else
     for(i=1;i<=8;i++)
        if(4 != i)
           test(i);
           
  qsort(show[1],count,sizeof(show[1]),cmp);//结果排序
      
   tmp1 = binary(1);
  for(i=1;i<=num;i++)
     printf("%d",show[1][i]);
   printf("\n");
  for(i=2;i<=count;i++)
   {
     tmp2 = binary(i);
     if(tmp2!=tmp1)
     {
        for(j=1;j<=num;j++)
           printf("%d",show[i][j]);
        printf("\n");
        tmp1 = tmp2;
     }
   }
  
   //system("pause");
   return 0;
}