莫欺少年穷,修魔之旅在这开始—>算法提高课题解
思路:
1. 对第一行枚举32种操作
2. 依次固定1~4行,让下一行灯全亮
3. 判断最后一行是否还有灯没亮
4. 选取32种操作中的最优解
#include<bits/stdc++.h>
using namespace std;
const int N = 5;
char g[N][N],bg[N][N];
//对g[x][y]上下左右及自己的灯都按一遍
void turn(int x,int y)
{
int dx[5]={-1,0,1,0,0},dy[5]={0,1,0,-1,0};
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) continue;
g[a][b]^=1;
}
}
int main()
{
int T;
cin>>T;
while(T--)
{
for(int i=0;i<5;i++) cin>>bg[i];
int res=10;
for(int op=0;op<32;op++)
{
int cnt=0;
//需要对原来的灯进行备份
memcpy(g,bg,sizeof bg);
//对第一行进行32种操作
for(int i=0;i<5;i++)
if(op>>i&1)
{
turn(0,i);
cnt++;
}
//依次固定1~4行
for(int i=0;i<4;i++)
for(int j=0;j<5;j++)
if(g[i][j]=='0')
{
turn(i+1,j);
cnt++;
}
//检查最后一行是否还有'0'
bool flag=true;
for(int i=0;i<5;i++)
if(g[4][i]=='0')
flag=false;
//取32种操作的最优解
if(flag) res=min(res,cnt);
}
if(res>6) cout<<-1<<endl;
else cout<<res<<endl;
}
return 0;
}
nb! 你是准备成仙啊
加油!