Fork me on GitHub

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 }
复制代码

 

posted @   Gifur  阅读(615)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
TOP
点击右上角即可分享
微信分享提示