SCAU 9509 开灯
9509 开灯
时间限制:1000MS 内存限制:65535K
题型: 编程题 语言: 无限制
Description
有16的开关分别控制16盏灯,开关排列成4*4的矩形,这些开关有这样的关系: 你改变其中一个开关的状态,与其同行和同列的开关的状态也跟着改变。先给出一个这些开关的初始状态,要求将所有的开关都打开,让所有的灯都亮起来,要求按下开关的次数最少。
输入格式
第一行输入一个整数t,表示有多少个case,每个case之间有一空行,每个case输入一个0、1组成的4*4的矩阵,0表示开关状态为关,1表示开关状态为开。
输出格式
每个case输出一行,让所有灯都亮的最少按开关数。
输入样例
1 1011 1111 1111 1011
输出样例
6
提示
分别按下(1,1),(1,3),(1,4),(4,1),(4,3),(4,4)6个开关就行了
对于 1111 1011 1111 1111 要把第二行和第二列的灯各按一次。 // 这里输出为 7
来源
Zyq
作者
a470086609
【解题思路】这题对我来说有意义,找回了老菜鸟的感觉,题目就是简单的暴力BFS,没有技巧可言而且数据水不用剪枝都能过。自己耗时长的原因有两点,一点是不应该的,即对输出的处理,忽略了换行和空格对字符的影响,而且最初直接输入整型,忘记了这些1、0之间是没有空格的。另外一点是自己找规律的时候忽略了一些条件,一开始直接用两个一维数组记录行和列等被开关的次数,最后直接判断其是否为偶数而决定此刻对灯亮灭的影响。忽略掉了行列坐标相等的情况,而且对此做了判断还留意到会影响其他灯的情况。索性就改用了最直接的思路,直接给每一盏灯给一个数组下标,存储被开关的次数。
1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #define SIZE 4 5 6 using namespace std; 7 8 int light[SIZE*SIZE], visit[SIZE*SIZE]; 9 int times; 10 11 bool is_value(int curpush) 12 { 13 for(int i=0; i<SIZE*SIZE; ++i) 14 { 15 if((light[i] && visit[i]%2) || (!light[i] && !(visit[i]%2))) return false; 16 } 17 if(curpush < times) times = curpush; 18 return true; 19 } 20 21 void Traverse(int cur, int pushtimes) 22 { 23 if(is_value(pushtimes) || cur == SIZE*SIZE) return; 24 25 int x = cur/SIZE; 26 int y = cur%SIZE; 27 28 Traverse(cur+1, pushtimes); 29 30 for(int i=0; i<SIZE*SIZE; ++i) 31 { 32 if(i/SIZE == x) visit[i]++; 33 if(i%SIZE == y) visit[i]++; 34 } 35 visit[cur]--; 36 37 Traverse(cur+1, pushtimes+1); 38 39 for(int i=0; i<SIZE*SIZE; ++i) 40 { 41 if(i/SIZE == x) visit[i]--; 42 if(i%SIZE == y) visit[i]--; 43 } 44 visit[cur]++; 45 46 return; 47 } 48 49 int main() 50 { 51 // freopen("input.txt", "r", stdin); 52 int t; 53 char input; 54 scanf("%d", &t); 55 while(t--) 56 { 57 memset(visit, 0, sizeof(visit)); 58 for(int i=0; i<SIZE*SIZE; ++i) 59 { 60 if(i%SIZE == 0) getchar(); 61 scanf("%c", &input); 62 light[i] = input - '0'; 63 } 64 times = SIZE*SIZE; 65 Traverse(0, 0); 66 printf("%d\n", times); 67 if(t != 0) getchar(); 68 } 69 return 0; 70 }
更多内容请关注个人微信公众号 物役记 (微信号:materialchains)
作者:雪影蓝枫
本文版权归作者和博客园共有,欢迎转载,未经作者同意须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。


浙公网安备 33010602011771号