小红开灯(四)

题目链接:https://ac.nowcoder.com/acm/contest/107000/E

题意:

n行m列的矩阵,每次可以改变两个相邻的灯的状态,求将灯全开的操作

思路:

当遇到两个0相邻时直接将其变为1。
当一个0与一个1相邻时可以交换0,1的位置
不妨将0全部移到最右列
0的个数为奇数时无法变为全1矩阵

void solve(){
    int n,m;cin>>n>>m;
    int cnt=0;
    rep(i,1,n){
        string s;cin>>s;
        for(int j=0;j<m;j++){
            g[i][j+1]=s[j]-'0';
            if(g[i][j+1]==0)cnt++;
        }
    }
    if(cnt&1){
        cout<<-1<<endl;return;
    }
    vector<pair<pii,pii>>ans;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            if(g[i][j]==0){
                if(j+1<=m&&g[i][j+1]==0){
                    g[i][j]=g[i][j+1]=1;
                }else if(j+1<=m&&g[i][j+1]==1){
                    g[i][j]=1;g[i][j+1]=0;
                }
                if(j+1<=m){
                    ans.pb({{i,j},{i,j+1}});
                }
            }
        }
    }
    for(int i=1;i<=n;i++){
        if(i+1<=n&&g[i][m]==0&&g[i+1][m]==0){
            g[i][m]=g[i+1][m]=1;
            // cout<<i<<' '<<m<<' '<<i+1<<' '<<m<<endl;
            ans.pb({{i,m},{i+1,m}});
        }
        else if(i+1<=n&&g[i][m]==0&&g[i+1][m]==1){
            g[i][m]=1;g[i+1][m]=0;
            ans.pb({{i,m},{i+1,m}});
        }
    }
    cout<<ans.size()<<endl;
    for(int i=0;i<ans.size();i++){
        cout<<ans[i].fi.fi<<' '<<ans[i].fi.se<<' '<<ans[i].se.fi<<' '<<ans[i].se.se<<endl;
    }
}
posted @ 2025-04-16 15:56  Marinaco  阅读(15)  评论(0)    收藏  举报
//雪花飘落效果