9.解谜游戏

Description

小张是一个密室逃脱爱好者,在密室逃脱的游戏中,你需要解开一系列谜题最终拿到出门的密码。现在小张需要打开一个藏有线索的箱子,但箱子上有下图所示的密码锁。

每个点是一个按钮,每个按钮里面有一个小灯。如上图,红色代表灯亮,白色代表灯灭。每当按下按钮,此按钮的灯以及其上下左右四个方向按钮的灯状态会改变(如果原来灯亮则灯灭,如果原来灯灭则灯亮)。如果小张通过按按钮将灯全部熄灭则能可以打开箱子。

对于这个密码锁,我们可以先按下左上角的按钮,密码锁状态变为下图。

再按下右下角的按钮,密码锁状态变为下图。

最后按下中间的按钮,灯全部熄灭。

现在小张给你一些密码锁的状态,请你告诉他最少按几次按钮能够把灯全部熄灭。

Input

第一行两个整数

n,m(1 \leq n,m \leq 16 )

接下来

n

行,每行一个长度为

m

的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;  
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值