Description
小张是一个密室逃脱爱好者,在密室逃脱的游戏中,你需要解开一系列谜题最终拿到出门的密码。现在小张需要打开一个藏有线索的箱子,但箱子上有下图所示的密码锁。
每个点是一个按钮,每个按钮里面有一个小灯。如上图,红色代表灯亮,白色代表灯灭。每当按下按钮,此按钮的灯以及其上下左右四个方向按钮的灯状态会改变(如果原来灯亮则灯灭,如果原来灯灭则灯亮)。如果小张通过按按钮将灯全部熄灭则能可以打开箱子。
对于这个密码锁,我们可以先按下左上角的按钮,密码锁状态变为下图。
再按下右下角的按钮,密码锁状态变为下图。
最后按下中间的按钮,灯全部熄灭。
现在小张给你一些密码锁的状态,请你告诉他最少按几次按钮能够把灯全部熄灭。
Input
第一行两个整数
。
接下来
行,每行一个长度为
的01字符串,0表示灯初始状态灭,1表示灯初始状态亮。
Output
一行一个整数,表示最少按几次按钮可以把灯全部熄灭。
Notes
第一个样例见题目描述,第二个样例按左上和右下两个按钮。
测试用例保证一定有解。
代码如下:
看到这道题是C++写的就知道这道题是“借鉴”的学长的代码,主要当时要做游戏,时间太紧了,防止吃到折扣就直接套了一下哈哈
#include <cstdio>
#include <cstring>
#include<iostream>
using namespace std;
char s[50][50],C[50][50];
int x[5]={-1,0,1,0,0},y[5]={0,1,0,-1,0};
int n,m,a,b;
long long ans=0x7f3f3f3f,count;
void T(int v,int u)
{
for(int i=0;i<=4;i++)
{
a=v+x[i],b=u+y[i];
if(a<0||b<0||a>=n||b>=m) continue;
if(s[a][b]=='1') s[a][b]='0';
else s[a][b]='1';
}
}
int main()
{
int o,j,i,p;
scanf("%d%d",&n,&m);
for(i=0;i<n;i++) scanf("%s",C[i]);
for(o=0;o<(1<<m);o++)
{
count=0;
memcpy(s,C,sizeof s);
for(i=0;i<m;i++)
{
if (o>>i&1)
{
T(0,i);
count++;
}
}
if(n>1) for(i=0;i<n-1;i++)
{
for(j=0;j<=m-1;j++)
{
if(s[i][j]=='1')
{
T(i+1,j);
count++;
}
}
}
p=1;
for(i=0;i<=m-1;i++) if(s[n-1][i]=='1') p=0;
if(p) ans=min(ans,count);
}
printf("%d\n",ans);
return 0;
}