2017-9-2
题目描述
给出部分灯最后的状态以及按的次数,求出可能的结果
解答
注意题意的理解,我对最后的结果进行了排序
代码
/*
ID: 18795871
PROG: lamps
LANG: C++
*/
#include<iostream>
#include<fstream>
#include<cstring>
#include<cstdio>
using namespace std;
ifstream fin("lamps.in");
ofstream fout("lamps.out");
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;
fin>>m;
while (m!=-1) {
f[m]=1;
fin>>m;
}
fin>>m;
while (m!=-1) {
f[m]=-1;
fin>>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) fout<<"IMPOSSIBLE"<<endl;
int i,j;
for (i=0; i<k; i++) y[i][n]='\0';
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++) {
fout<<y[i]<<endl;
}
}
int main() {
fin>>n>>c;
init();
res();
out();
}