题目链接
AcWing 95.
思路:先枚举第一行的状态,再依次判断其他每个位置是否需要操作。
代码:
#include <bits/stdc++.h>
using namespace std;
char s[7][7];
char b[7][7];
int dx[4] = {0,0,1,-1};
int dy[4] = {1,-1,0,0};
void calc(char &c){
c = (char)(((c - '0') ^ 1) + '0');
}
void trans(int i,int j){
calc(b[i][j]);
for(int p=0;p<4;p++){
int tx = i + dx[p];
int ty = j + dy[p];
if(tx<0 || tx>4 || ty<0 || ty>4) continue;
calc(b[tx][ty]);
}
return;
}
bool check(){
for(int i=0;i<5;i++)
for(int j=0;j<5;j++)
if(b[i][j]=='0')
return false;
return true;
}
void myprint(){
for(int j=0;j<5;j++){
for(int k=0;k<5;k++){
cout << b[j][k];
}
cout << endl;
}
}
void solve(){
for(int i=0;i<5;i++)
cin >> s[i];
int ans = 2e9;
bool f = 0;
for(int i=0;i<(1<<5);i++){
for(int j=0;j<5;j++)
for(int k=0;k<5;k++)
b[j][k] = s[j][k];
int cnt = 0;
// 枚举第一行每一列
for(int j=0;j<5;j++){
if((i>>j)&1){
cnt++;
trans(0,j);
}
}
// 枚举剩余行
for(int j=1;j<5;j++){
for(int k=0;k<5;k++){
if(b[j-1][k]=='0'){
cnt++;
trans(j,k);
}
}
}
// check
if(check()){
f = 1;
}else{
continue;
}
ans = min(ans,cnt);
}
if(!f || ans>6) cout << "-1\n";
else cout << ans << endl;
}
int main()
{
std::ios::sync_with_stdio(false);std::cin.tie(nullptr);
int t;
cin >> t;
while(t--){
solve();
}
return 0;
}