小红开灯(四)
题目链接: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;
}
}

浙公网安备 33010602011771号