USACO 2.2.4 Party Lamps

来源:互联网 发布:值得买自动采集源码 编辑:程序博客网 时间:2024/05/16 10:16
// Party Lamps.cpp : 定义控制台应用程序的入口点。///*ID: maiyuet1PROG: lampsLANG: C++*///#include "stdafx.h"//这道题的纠结程序不亚于之前那道rectanle深搜//按下按钮次数c若为0,1,2独立讨论。当c>=3时,若c为奇数,则情况都一样 若c为偶数,情况也都一样//因为每个按钮按2次和没按效果是一样的,所以有4个按钮,不管按多少次都只有2^4次的情况#include <iostream>#include <string>#include <cstdio>#include <cstring>#include <queue>#include <set>using namespace std;const int MAXN = 110;int on[MAXN];int off[MAXN];int num_on = 0;int num_off = 0;char state1[100][100] = {"0001","0010","0100","1000"};  //1个灯亮的情况char state2[100][100] = {"0000","1100","1010","1001","0011","0101","0110"}; //2个灯亮char state3[100][100] = {"0111","1110","1101","1011"};  //3个灯亮char state4[100][100] = {"1111"};  //4个灯亮set<string>S;void change(string& a, char b[]){if(b[0] == '1'){for(int i=0; i<a.length(); i++){if(a[i] == '0'){a[i] = '1';}else{a[i] = '0';}}}if(b[1] == '1'){for(int i=0; i<a.length(); i=i+2){if(a[i] == '0'){a[i] = '1';}else{a[i] = '0';}}}if(b[2] == '1'){for(int i=1; i<a.length(); i=i+2){if(a[i] == '0'){a[i] = '1';}else{a[i] = '0';}}}if(b[3] == '1'){for(int i=0; ; i++){int j = 3 * i;if(j >= a.length()){break;}if(a[j] == '0'){a[j] = '1';}else{a[j] = '0';}}}}int judge(string str){for(int i=0; i<num_on; i++){if(str[on[i]-1] == '0'){return 0;}}for(int i=0; i<num_off; i++){if(str[off[i]-1] == '1'){return 0;}}return 1;}void init(string& start, int n){for(int i=0; i<n; i++){start[i] = '1';}}int main(){freopen("lamps.in","r",stdin);freopen("lamps.out","w",stdout);int n,c;int a;cin>>n>>c;while(1){cin>>a;if(a == -1){break;}on[num_on++] = a;}while(1){cin>>a;if(a == -1){break;}off[num_off++] = a;}string start(n,' ');  //初始化start大小set<string>::iterator p;if(c == 0){init(start,n);if(judge(start)){S.insert(start);}}else if(c == 1){for(int i=0; i<4; i++){change(start,state1[i]);}}else if(c == 2){//1111111111111111....init(start,n);if(judge(start)){S.insert(start);}for(int i=0; i<7; i++){init(start,n);change(start,state2[i]);if(judge(start)){S.insert(start);}}}else if(c % 2 == 1)  //次数为奇数{for(int i=0; i<4; i++){init(start,n);change(start,state1[i]);if(judge(start)){S.insert(start);}}for(int i=0; i<4; i++){init(start,n);change(start,state3[i]);if(judge(start)){S.insert(start);}}}else   //次数为偶数2{//初始状态init(start,n);if(judge(start)){S.insert(start);}for(int i=0; i<7; i++){init(start,n);change(start,state2[i]);if(judge(start)){S.insert(start);}}init(start,n);change(start,state4[0]);if(judge(start)){S.insert(start);}}if(S.empty()){cout<<"IMPOSSIBLE"<<endl;}for(p=S.begin(); p!=S.end(); p++){cout<<*p<<endl;}return0;}