CODEVS-2050 派对灯

来源:互联网 发布:数控编程指令g代码 编辑:程序博客网 时间:2024/05/16 08:04

2017-6-8

题目描述

给你n盏开着的灯,开关的次数,以及部分灯最后的状态,求出所有可能的情况

解答

史上最长的代码同一个按钮按奇数次都是一样的,按偶数次也都是一样的

代码

#include<iostream>#include<cstring>#include<cstdio>using namespace std;const int N = 100;char x[N+1];int f[N+1];int a[4];int n,c;char y[N+1][N+1];int k=0;void init(){    int m;  cin>>m;    while (m!=-1){        f[m]=1;        cin>>m;    }  cin>>m;    while (m!=-1){        f[m]=-1;        cin>>m;    }}int cal(){    int sum=0;    for (int i=0;i<4;i++){        if (a[i]==1) sum++;    }    return sum;}void re(){    if (a[0]==1){       for (int i=1;i<=n;i++){          x[i]=(x[i]-'0'+1)%2+'0';       }    }    if (a[1]==1){       for (int i=1;i<=n;i++){          if (i%2==1) x[i]=(x[i]-'0'+1)%2+'0';       }    }    if (a[2]==1){       for (int i=1;i<=n;i++){          if (i%2==0) x[i]=(x[i]-'0'+1)%2+'0';       }    }    if (a[3]==1){        for (int i=1;i<=n;i++){            if (i%3==1) x[i]=(x[i]-'0'+1)%2+'0';        }    }}bool tru(){    for (int i=1;i<=n;i++){        if (f[i]==1){            if (x[i]!='1') return false;        }        else if (f[i]==-1){            if (x[i]!='0') return false;        }    }    return true;}void set(){    for(int i=1;i<=n;i++) x[i]='1';}void res(){    for (a[0]=0;a[0]<=1;a[0]++){        for (a[1]=0;a[1]<=1;a[1]++){            for (a[2]=0;a[2]<=1;a[2]++){                for (a[3]=0;a[3]<=1;a[3]++){                    set();                    if (c==0){                        if (cal()==0){                           if (tru()){                              for (int i=0;i<n;i++)                                  y[k][i]=x[i+1];                              k++;                            }                        }                    }                    else if (c==1){                        if (cal()==1){                           re();                           if (tru()){                              for (int i=0;i<n;i++)                                  y[k][i]=x[i+1];                              k++;                            }                        }                    }                    else if (c==2){                          if (cal()==0){                            if (tru()){                               for (int i=0;i<n;i++)                                   y[k][i]=x[i+1];                               k++;                            }                          }                          else if (cal()==2){                            re();                            if (tru()){                              for (int i=0;i<n;i++)                                  y[k][i]=x[i+1];                              k++;                            }                        }                    }                    else{                         if (c%2==0){                              if (cal()==0){                              if (tru()){                               for (int i=0;i<n;i++)                                   y[k][i]=x[i+1];                               k++;                            }                          }                            else if (cal()==2){                               re();                               if (tru()){                               for (int i=0;i<n;i++)                                    y[k][i]=x[i+1];                               k++;                               }                          }                            else if (cal()==4){                                 re();                             if (tru()){                              for (int i=0;i<n;i++)                                   y[k][i]=x[i+1];                              k++;                             }                           }                        }                        else{                            if (cal()==1){                               re();                               if (tru()){                               for (int i=0;i<n;i++)                                   y[k][i]=x[i+1];                               k++;                            }                          }                           else if (cal()==3){                             re();                             if (tru()){                               for (int i=0;i<n;i++)                                   y[k][i]=x[i+1];                                k++;                            }                        }                    }                }            }        }     }  }}void out(){  if (k==0) cout<<"IMPOSSIBLE"<<endl;  int i,j;  for (i=0;i<k;i++) y[i][n]='\0';  for (i=0;i<k;i++){  }  char t[N+1];  for (i=0;i<k-1;i++){    for (j=0;j<k-i-1;j++){      if (strcmp(y[j],y[j+1])>0){         strcpy(t,y[j]);         strcpy(y[j],y[j+1]);         strcpy(y[j+1],t);      }    }  }   for (i=0;i<k;i++){      cout<<y[i]<<endl;  }}int main(){    cin>>n>>c;    init();    res();    out();}
原创粉丝点击