Party Lamps
来源:互联网 发布:阿里云 源代码管理 编辑:程序博客网 时间:2024/04/30 07:59
题意:有N盏灯,编号为(1~N)。有四个开关,功能分别为(改变全部灯的状态,改变奇数灯的状态,改变偶数灯的状态,改变3k+1(k>=0)灯的状态)。给定一个按键的次数C还有某些灯的状态,如果开始的时候所有灯都是亮的,求解最后可能的状态
解题思路:
- 读入输入
- 每个开关按两次相当于没按,所以每个按键只有可能是按下或者没按,那么最后按键的状态只有2^4 = 16种,将这16种状态列出来可以得到最后所有可能的等的状态
- 如果某种按键情况下按下了N枚按键,那么如果C = N + 2k (k>=0),则C次按键最终可以得到这样的按键情况
- 从输入中获得的C可以得到最终可能的按键情况,然后按照按键条件可以得到最终灯的情况,将这些情况排序一下就能输出最后的结果
代码:
/*ID: zc.rene1LANG: CPROG: lamps */#include<stdio.h>#include<stdlib.h>#include<string.h>enum Button{Button1=1, Button2=2, Button3=4, Button4=8};int N;void PrintArray(int *arr, FILE *fout){ int i; for (i=0; i<N; i++) {fprintf(fout, "%d", arr[i]); } fprintf(fout, "\n");}int Bigger(int *arr1, int *arr2){ int i; for (i=0; i<N; i++) {if (arr1[i] > arr2[i]){ return 1;}else if (arr1[i] < arr2[i]){ return 0;}else{ continue;} } return 1;}void SortArray(int **arr, int index){ int i, j; int *temp; for (i=index-1; i>0; i--) {for (j=0; j<i; j++){ if (Bigger(arr[j], arr[j+1])) {temp = arr[j];arr[j] = arr[j+1];arr[j+1] = temp; }} }}int Check(int *arr, int *final_arr){ int i; for (i=0; i<N; i++) {if ((final_arr[i] != -1) && (arr[i] != final_arr[i])){ return 0;} } return 1;}int Count(int num){ int ret = 0; while (num != 0) {if (num%2 == 1){ ret++;}num >>= 1; } return ret;}void GenerateState(int button, int* arr){ int i; if ((button&Button1) != 0) {for (i=0; i<N; i++){ arr[i] = ((arr[i]==0)?1:0);} } if ((button&Button2) != 0) {for (i=0; i<N; i+=2){ arr[i] = ((arr[i]==0)?1:0);} } if ((button&Button3) != 0) {for (i=1; i<N; i+=2){ arr[i] = ((arr[i]==0)?1:0);} } if ((button&Button4) != 0) {for (i=0; i<N; i+=3){ arr[i] = ((arr[i]==0)?1:0);} }} int main(void){ FILE *fin, *fout; int **state; int *final_state; int **result; int C; int i, j, index, temp; fin = fopen("lamps.in", "r"); fout = fopen("lamps.out", "w"); fscanf(fin, "%d\n%d", &N, &C); final_state = (int*)malloc(N*sizeof(int)); memset(final_state, -1, N*sizeof(int)); state = (int**)malloc(16*sizeof(int*)); result = (int**)malloc(16*sizeof(int*)); for (i=0; i<16; i++) {state[i] = (int*)malloc(N*sizeof(int));for (j=0; j<N; j++){ state[i][j] = 1;} } while (fscanf(fin, "%d", &temp)) {if (temp == -1){ break;}final_state[temp-1] = 1; } while (fscanf(fin, "%d", &temp)) {if (temp == -1){ break;}final_state[temp-1] = 0; } for (i=0; i<16; i++) {GenerateState(i, state[i]); } index = 0; for (i=0; i<16; i++) {temp = C - Count(i);if ((temp>=0)&&(temp%2==0)){ if (Check(state[i], final_state)) {result[index++] = state[i]; }} } if (index == 0) {fprintf(fout, "IMPOSSIBLE\n"); } else{SortArray(result, index);for (i=0; i<index; i++){ PrintArray(result[i], fout);} } return 0;}
- Party Lamps
- Party Lamps
- Party Lamps
- USACO 2.2 Party Lamps (lamps)
- USACO2.2.4 Party Lamps (lamps)
- USACO2.2.4 Party Lamps (lamps)
- 1176 Party Lamps
- 【其他】【USACO】Party Lamps
- Section 2.2 Party Lamps
- 2.2Party Lamps
- USACO 2.2 Party Lamps
- USACO Party Lamps
- usaco Party Lamps
- [USACO]Party Lamps
- usaco2.24Party Lamps
- USACO:Party Lamps
- USACO-Party Lamps
- USACO 2.2 Party Lamps
- Codeforces 131D - Subway
- Android压缩图片到100K以下并保持不失真的高效方法
- PCA的一些基本资料
- 每次一起玩都是感动。 我永远的回忆
- Comet:基于 HTTP 长连接的“服务器推”技术
- Party Lamps
- UNIX内核概述-进程实现
- struts标签,el表达式,ognl表达式
- 蚁群算法java实现以及TSP问题蚁群算法求解
- Android------JNI 数据类型转换
- 第一篇博客
- android layer_list 用法总结 button颜色控制
- struts2的action中获取request、response、session的方法
- 状态模式(State pattern)