[kuangbin带你飞]专题1——简单搜索——母牛翻转问题

题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=65959#problem/D

话说这个问题的思路是,枚举第一行,然后进行模拟,但是还是不怎么能懂,看了bin神的代码,自己差不多原样写了下来,但是,有的地方还是不怎么能懂。

知道是按顺序模拟,但还是,没能完全理解透,相信时间会解决的。

 

发下代码:

#include<iostream>
#include<sstream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>

using namespace std;

int map[20][20],map2[20][20],ans[20][20];
int M,N;
int d[][2]={{0,1},{0,-1},{1,0},{-1,0},{0,0}};

int isok(int n){
    memset(ans,0,sizeof(ans));
    memcpy(map2,map,sizeof(map2));
    for(int j=0;j<N;j++)
        map2[0][j+1]=(n>>j)%2;
    for(int i=1;i<=M;i++)
        for(int j=1;j<=N;j++){
            if(!map2[i-1][j]) continue;
            ans[i][j]=1;
            for(int p=0;p<5;p++)
                map2[i+d[p][0]][j+d[p][1]]=!map2[i+d[p][0]][j+d[p][1]];
        }
    for(int j=1;j<=N;j++)
        if(map2[M][j]) return 0;
    return 1;
}

int main(){
    while(cin>>M)
    {
        cin>>N;
        if(!M && !N) break;
        for(int i=1;i<=M;i++)
            for(int j=1;j<=N;j++)
                cin>>map[i][j];
        int op=0;
        for(int i=0;i<(1<<N);i++)
            if(isok(i)){
                op=1;
                 break;
            }
        if(op){
        for(int i=1;i<=M;i++)
            for(int j=1;j<=N;j++)
                if(j==N) cout<<ans[i][j]<<endl;
                else cout<<ans[i][j]<<" ";
        }
        else cout<<"IMPOSSIBLE\n";
    }
    return 0;
}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值