分享

USACO/lamps

 liluvu 2014-01-17

Party Lamps派对灯(IOI98)

目录

 [隐藏

[编辑] 描述

在IOI98的节日宴会上,我们有N(10<=N<=100)盏彩色灯,他们分别从1到N被标上号码。 这些灯都连接到四个按钮:

按钮1:当按下此按钮,将改变所有的灯:本来亮着的灯就熄灭,本来是关着的灯被点亮。 
按钮2:当按下此按钮,将改变所有奇数号的灯。
按钮3:当按下此按钮,将改变所有偶数号的灯。
按钮4:当按下此按钮,将改变所有序号是3*K+1(K>=0)的灯。例如:1,4,7...

一个计数器C记录按钮被按下的次数。当宴会开始,所有的灯都亮着,此时计数器C为0。

你将得到计数器C(0<=C<=10000)上的数值和经过若干操作后某些灯的状态。写一个程序去找出所有灯最后可能的与所给出信息相符的状态,并且没有重复。

[编辑] 格式

PROGRAM NAME: lamps

INPUT FORMAT:

(file lamps.in)

不会有灯会在输入中出现两次。

第一行: N。

第二行: C最后显示的数值。

第三行: 最后亮着的灯,用一个空格分开,以-1为结束。

第四行: 最后关着的灯,用一个空格分开,以-1为结束。

OUTPUT FORMAT:

(file lamps.out)

每一行是所有灯可能的最后状态(没有重复)。每一行有N个字符,第1个字符表示1号灯,最后一个字符表示N号灯。0表示关闭,1表示亮着。这些行必须从小到大排列(看作是二进制数)。

如果没有可能的状态,则输出一行'IMPOSSIBLE'。

[编辑] SAMPLE INPUT

10
1
-1
7 -1

在这个样例中,有10盏灯,只有1个按钮被按下。最后7号灯是关着的。

[编辑] SAMPLE OUTPUT

0000000000
0101010101
0110110110

在这个样例中,有三种可能的状态:

所有灯都关着

1,4,7,10号灯关着,2,3,5,6,8,9亮着。

1,3,5,7,9号灯关着,2, 4, 6, 8, 10亮着。 


/*

ID: liluvu1

LANG: C++

TASK: lamps

*/


#include <stdio.h>

#include <string.h>

#include <stdlib.h>



#define N 100

#define C 10000


int n;

int c;

FILE *fin = NULL;

FILE *fout = NULL;

int startState[N+1];

int endState[N+1];


int pArr[2];


int result[8];

int sortRef[8] = {0, 1, 7, 2, 4, 5, 3, 6};

int rI = 0;


int validate(int start[], int end[]) {

for (int i = 1; i <= n; i++){

if (end[i] != -1 && end[i] != start[i])

return 0;

}

return 1;

}


void turn1(int state[], int n) {

for (int i = 1; i <= n; i++)

state[i] = !state[i];

}


void turn2(int state[], int n) {

for (int i = 1; i <= n; i+=2)

state[i] = !state[i];

}


void turn3(int state[], int n) {

for (int i = 2; i <= n; i+=2)

state[i] = !state[i];

}


void turn4(int state[], int n) {

for (int i = 1; i <= n; i+=3)

state[i] = !state[i];

}


void (*func[])(int state[], int n) = {0, turn1, turn2, turn3, turn4};


// 1,2 =3; 1,3 = 2; 2,3 =1;

// 1 < 3,4 < 2 < 4 < 1,4 < 3 < 2,4

void handlePermute(int j){

int temp[N+1];

memcpy(temp, startState, sizeof(temp));


for (int m = 0; m < j; m++) {

func[pArr[m]](temp, n);

}

if (validate(temp, endState)){

if (j == 1) {

rI++;

result[pArr[0]] = 1;

} else {

if (c%2 == 0){

if (pArr[0] == 1 && pArr[1] == 2){

result[3] = 1;

} else if (pArr[0] == 1 && pArr[1] == 3) {

result[2] = 1;

} else if (pArr[0] == 2 && pArr[1] == 3) {

result[1] = 1;

} else {

result[pArr[0]+pArr[1]] = 1;

}

rI++;

}

}

}

}


void permute(int i, int j, int v){

if (i >= j) {

handlePermute(j);

} else {

for (int m = 1; m <= v; m++){

if (i == 0 || (i > 0 && m > pArr[i-1])) {

pArr[i] = m;

permute(i+1, j, v);

}

}

}

}



int main(){

fin = fopen("lamps.in", "r");

fout = fopen("lamps.out", "w");


fscanf(fin, "%d\n", &n);

fscanf(fin, "%d\n", &c);


for (int i = 1; i <= n; i++){

startState[i] = 1;

endState[i] = -1;

}


int s;

while (fscanf(fin, "%d", &s) && s != -1) {

endState[s] = 1;

}


fscanf(fin, "\n");


while (fscanf(fin, "%d", &s) && s != -1) {

endState[s] = 0;

}

if (c == 0) {

if (validate(startState, endState)){

rI++;

for (int i = 1; i <= n; i++){

fprintf(fout, "%d", startState[i]);

}

fprintf(fout, "\n");

}

} else {

permute(0, 1, 4);

permute(0, 2, 4);

}


if (rI){

int temp[N+1];

for (int i = 1; i <= 7; i++){

int j = sortRef[i];

if (result[sortRef[i]]){

memcpy(temp, startState, sizeof(temp));

if (j <= 4) {

func[j](temp, n);

} else if (j == 5) {

func[1](temp, n);

func[4](temp, n);

} else if (j == 6) {

func[2](temp, n);

func[4](temp, n);

} else if (j == 7) {

func[3](temp, n);

func[4](temp, n);

}


for (int i = 1; i <= n; i++){

fprintf(fout, "%d", temp[i]);

}

fprintf(fout, "\n");

}

}

if (c != 0 && c%2 == 0) {

if (validate(startState, endState)){

rI++;

for (int i = 1; i <= n; i++){

fprintf(fout, "%d", startState[i]);

}

fprintf(fout, "\n");

}

}

} else {

fprintf(fout, "%s\n", "IMPOSSIBLE");

}

return 0;

}

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多