暴力枚举每一种可能性
虽然正解是状压,但是爆搜至少不应该RE吧
#include<bits/stdc++.h>
using namespace std;
int n;
int a[100][100];
int ans = 1e9;
char c[100];
bool dfs(int step,int cnt){
if(step > 6) return 0;
// cout << step << " " << cnt << '\n';
// for(int i = 1;i <= 5;i++){
// for(int j = 1;j <= 5;j++){
// cout << a[i][j] << " ";
// }
// cout << '\n';
// }
// puts("A");
if(cnt >= 25){
ans = min(ans,step);
return 1;
}
// int flag = 0;
// for(int i = 1;i <= 5;i++){
// for(int j = 1;j <= 5;j++){
// cout << a[i][j] << " ";
// flag += a[i][j];
// }
// cout << '\n';
// }
// cout << cnt << "\n____________\n";
// if(flag == 25){
// ans = min(ans,step);
// return 1;
// }
if(step > 6) return 0;
for(int i = 1;i <= 5;i++){
for(int j = 1;j <= 5;j++){
if(a[i][j]) continue;
if(!a[i][j]){
a[i][j] ^= 1;
if(i == 1){
if(j == 1){
int delta = 0;
delta += ((!a[i + 1][j]) + (!a[i][j + 1]));
a[i + 1][j] ^= 1;
a[i][j + 1] ^= 1;
dfs(step + 1,cnt + delta + 1 - (2 - delta));
a[i + 1][j] ^= 1;
a[i][j + 1] ^= 1;
}else if(j == 5){
int delta = 0;
delta += ((!a[i + 1][j]) + (!a[i][j - 1]));
a[i + 1][j] ^= 1;
a[i][j - 1] ^= 1;
dfs(step + 1,cnt + delta + 1);
a[i + 1][j] ^= 1;
a[i][j - 1] ^= 1;
}else{
int delta = 0;
delta += ((!a[i][j - 1]) + (!a[i][j + 1]) + (!a[i + 1][j]));
a[i][j - 1] ^= 1;
a[i][j + 1] ^= 1;
a[i + 1][j] ^= 1;
dfs(step + 1,cnt + delta + 1 - (3 - delta));
a[i][j - 1] ^= 1;
a[i][j + 1] ^= 1;
a[i + 1][j] ^= 1;
}
}else if(i == 5){
if(j == 1){
int delta = 0;
delta += ((!a[i - 1][j]) + (!a[i][j + 1]));
a[i - 1][j] ^= 1;
a[i][j + 1] ^= 1;
dfs(step + 1,cnt + delta + 1 - (2 - delta));
a[i][j + 1] ^= 1;
a[i - 1][j] ^= 1;
}else if(j == 5){
int delta = 0;
delta += ((!a[i][j - 1]) + (!a[i - 1][j]));
a[i][j - 1] ^= 1;
a[i - 1][j] ^= 1;
dfs(step + 1,cnt + delta + 1 - (2 - delta));
a[i][j - 1] ^= 1;
a[i - 1][j] ^= 1;
}else{
int delta = 0;
delta += ((!a[i][j - 1]) + (!a[i][j + 1]) + (!a[i - 1][j]));
a[i][j - 1] ^= 1;
a[i][j + 1] ^= 1;
a[i - 1][j] ^= 1;
dfs(step + 1,cnt + delta + 1 - (3 - delta));
a[i][j - 1] ^= 1;
a[i][j + 1] ^= 1;
a[i - 1][j] ^= 1;
}
}else{
if(j == 1){
int delta = 0;
delta += ((!a[i - 1][j]) + (!a[i + 1][j]) + (!a[i][j + 1]));
a[i - 1][j] ^= 1;
a[i + 1][j] ^= 1;
a[i][j + 1] ^= 1;
dfs(step + 1,cnt + delta + 1 - (3 - delta));
a[i - 1][j] ^= 1;
a[i + 1][j] ^= 1;
a[i][j + 1] ^= 1;
}else if(j == 5){
int delta = 0;
delta += ((!a[i - 1][j]) + (!a[i + 1][j]) + (!a[i][j - 1]));
a[i - 1][j] ^= 1;
a[i + 1][j] ^= 1;
a[i][j - 1] ^= 1;
dfs(step + 1,cnt + delta + 1 - (3 - delta));
a[i - 1][j] ^= 1;
a[i + 1][j] ^= 1;
a[i][j - 1] ^= 1;
}else{
int delta = 0;
delta += ((!a[i - 1][j]) + (!a[i + 1][j]) + (!a[i][j - 1]) + (!a[i][j + 1]));
a[i - 1][j] ^= 1;
a[i + 1][j] ^= 1;
a[i][j - 1] ^= 1;
a[i][j + 1] ^= 1;
dfs(step + 1,cnt + delta + 1 - (4 - delta));
a[i - 1][j] ^= 1;
a[i + 1][j] ^= 1;
a[i][j - 1] ^= 1;
a[i][j + 1] ^= 1;
}
}
a[i][j] ^= 1;
}
}
}
}
int main(){
// ios::sync_with_stdio(false);
// cin.tie(nullptr),cout.tie(nullptr);
cin >> n;
while(n--){
ans = 1e9;
int cnt = 0;
for(int i = 1;i <= 5;i++){
cin >> c;
for(int j = 1;j <= 5;j++){
a[i][j] = c[j - 1] - '0';
cnt += a[i][j];
}
}
// getchar();
// for(int i = 1;i <= 5;i++){
// for(int j = 1;j <= 5;j++){
// cout << a[i][j];
// if(j != 5) cout << "-";
// }
// cout << '\n';
// }
// int line;cin >> line;
bool can = dfs(0,cnt);
if(can && ans != (int)1e9) cout << ans << '\n';
else cout << "-1";
}
}