CODEVS-2050 派对灯

xiaoxiao2021-02-28  99

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(); }
转载请注明原文地址: https://www.6miu.com/read-68880.html

最新回复(0)