AcWing 95. 费解的开关
原题链接
中等
作者:
尼古拉斯小布丁
,
2021-04-01 09:53:16
,
所有人可见
,
阅读 295
递推写法,由上一行状态得到下一行应该按哪些开关.最后判断最后一行是否符合条件
写完调试半天,愣是不对,原来是memcpy函数用错了.错误将字符数组g置0
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int INF = 100000;
char g[6][6],backup[6][6];
int dx[5]={0,-1,0,1,0},dy[5]={0,0,1,0,-1};
int n;
void turn(int x, int y){
int a,b;
for(int i=0;i<5;i++){
a = x+dx[i],b=y+dy[i];
if(a>=0 && a<5 && b>=0 && b<5)
g[a][b]^=1;
}
return ;
}
int work(){
int ans = INF;
for(int k=0;k<32;k++){ //枚举第一行的32种可能
int res = 0;
memcpy(backup,g,sizeof(g)); //这个函数忘了用法
for(int i=0;i<5;i++){
if(k>>i & 1){ //如果k的第i为1
res++;
turn(0, i); //改变第1行中的该位
}
}
for(int i=0;i<4;i++){
for(int j=0;j<5;j++){
if(g[i][j] == '0'){ //如果当前位置为0,就按下一行的j位
res++;
turn(i+1, j);
}
}
}
bool is_successful = true;
for(int i=0;i<5;i++){ //检查最后一行是否符合条件
if(g[4][i]=='0'){
is_successful= false;
break;
}
}
if(is_successful) ans = min(ans,res);
memcpy(g, backup, sizeof(backup));
}
if(ans > 6) return -1;
else
return ans;
}
int main(){
cin>>n;
while(n--){
for(int i=0;i<5;i++) cin>>g[i];
// for(int i=0;i<5;i++) cout<<g[i]<<endl;
cout<<work()<<endl;
}
return 0;
}