现在的位置: 首页 > 综合 > 正文

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

2019年09月03日 ⁄ 综合 ⁄ 共 1294字 ⁄ 字号 评论关闭

题目链接: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;
}

 

 

抱歉!评论已关闭.