1. 程式人生 > >[kuangbin帶你飛]專題1——簡單搜尋——母牛翻轉問題

[kuangbin帶你飛]專題1——簡單搜尋——母牛翻轉問題

話說這個問題的思路是,列舉第一行,然後進行模擬,但是還是不怎麼能懂,看了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;
}