116. 飞行员兄弟

直接暴力枚举所有状态,时间复杂度:\(O(2^{16} \times 4^3)\)

const int N=5;
bool g[N][N],tmp[N][N];
int n=4,m=4;

bool check(int x,int y)
{
    return x>=0 && x<n && y>=0 && y<m;
}

void change(int x,int y)
{
    for(int i=0;i<n;i++) tmp[i][y]^=1;
    for(int i=0;i<m;i++) tmp[x][i]^=1;
    tmp[x][y]^=1;
}

int get(int x,int y)
{
    return x*n+y;
}

int main()
{
    for(int i=0;i<n;i++)
        for(int j=0;j<m;j++)
        {
            char c;
            cin>>c;
            if(c == '-') g[i][j]=1;
            else g[i][j]=0;
        }

    vector<PII> ans;
    for(int s=0;s<(1<<16);s++)
    {
        memcpy(tmp,g,sizeof g);

        vector<PII> res;
        int cnt=0;
        for(int i=0;i<n;i++)
            for(int j=0;j<m;j++)
                if(s>>get(i,j) & 1)
                {
                    change(i,j);
                    res.pb({i,j});
                }

        bool ok=true;
        for(int i=0;i<n;i++)
        {
           for(int j=0;j<m;j++)
                if(!tmp[i][j])
                {
                    ok=false;
                    break;
                }
            if(!ok) break;
        }

        if(ok && (ans.size() == 0 || ans.size() > res.size()))
            ans=res;
    }

    cout<<ans.size()<<endl;
    for(int i=0;i<ans.size();i++)
        cout<<ans[i].fi+1<<' '<<ans[i].se+1<<endl;
    //system("pause");
    return 0;
}
posted @ 2021-03-20 12:14  Dazzling!  阅读(46)  评论(0编辑  收藏  举报