递推方式——第一行的灯的状态决定全部灯状态,枚举第一行的状态(二进制)。
想清楚题的思路再代码实现。
debug时出现的问题:
1.写备份代码的时候会忘记复原
2.对于二维数组忘记考虑数组越界的情况
3.对结果的保存出问题了
4.定义变量时注意变量的范围
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
int n;
char s[10][10];
char backup[10][10];
int dx[5] = {0, -1, 0, 1, 0}, dy[5] = {0, 0, 1, 0, -1};
void turn(int x, int y)
{
for(int i = 0;i < 5;i ++ )
{
int a = x + dx[i], b = y + dy[i];
if(a >= 0 && a < 5 && b >= 0 && b < 5) //注意数组越界
s[a][b] ^= 1;//改变状态
}
}
int main()
{
cin >> n;
while(n -- )
{
int ans = 100;
for(int i = 0;i < 5;i ++ ) cin >> s[i];
memcpy(backup, s, sizeof s);
for(int i = 0;i < 1 << 5;i ++ )//枚举对第一行进行的操作->递推全部灯的状态
{
int res = 0;
for(int j = 0;j < 5;j ++ )
if(i >> j & 1)
{
turn(0, j);
res ++ ;
}
for(int j = 0;j < 4;j ++ )
for(int k = 0;k < 5;k ++ )
if(s[j][k] == '0')
{
turn(j + 1, k);
res ++ ;
}
bool dark = true;//dark用来判断是非满足条件
for(int j = 0;j < 5;j ++ )
if(s[4][j] == '0')
{
dark = false;
break;
}
if(dark)
ans = min(ans, res);
memcpy(s, backup, sizeof s);//别忘记备份
}
if(ans > 6) ans = -1;
cout << ans << endl;
}
}