Codeforces Round #684 (Div. 2) C2 Binary Table (Hard Version)
这题思路很简单,写起来就挺烦的
对于第1到n-2行,如果第i行j列是1,那么我们就对(i,j)(i+1,j)(i+1,j+1)进行操作,也就是把将操作的影响放到下一行,保证了当前行每一列都是0
然后到了最后两行,我们从左到右,如果是1,就进行操作,剩下的格子就选下一列的两个
然后就到了最后的2*2,反正就枚举一下,搞一下就行
详见代码
    #include<stdio.h>
    #define LOCAL 
    #include<bits/stdc++.h>
    using namespace std;
    #define ll long long
    char mp[150][150];
    struct node
    {
    	int x1,y1,x2,y2,x3,y3;
    }ans[1050000];
    int id=0;int n,m;
    void zh(int x1,int y1,int x2,int y2,int x3,int y3)
    {
    	ans[++id]=(node){x1,y1,x2,y2,x3,y3};
    	mp[x1][y1]^=1;mp[x2][y2]^=1;mp[x3][y3]^=1;
    }
    void zh0(int x1,int y1,int x2,int y2,int x3,int y3)
    {
    	ans[++id]=(node){x1,y1,x2,y2,x3,y3};
    }
    void zh1(int x1,int y1)
    {
    	if((x1==n-1&&y1==m-1)||(x1==n&&y1==m))
    	{
    		zh0(n-1,m-1,n,m-1,n,m);
    		zh0(n-1,m-1,n-1,m,n,m);
    		zh0(n-1,m,n,m-1,x1,y1);
    	}
    	else
    	{
    		zh0(n-1,m-1,n,m-1,n-1,m);
    		zh0(n,m-1,n,m,n-1,m);
    		zh0(n-1,m-1,n,m,x1,y1);
    	}
    }
    int main()
    {
    	int t;
    	scanf("%d",&t);
    	while(t--)
    	{
    		scanf("%d %d",&n,&m);
    		for(int i=1;i<=n;i++)
    		{
    			scanf("%s",mp[i]+1);
    		}
    		id=0;
    		for(int i=1;i<=n-2;i++)
    		{
    			for(int j=1;j<=m;j++)
    			{
    				if(mp[i][j]=='0') continue;
    				if(j!=m)
    				{
    					zh(i,j,i+1,j,i+1,j+1);
    				}
    				else zh(i,j,i+1,j-1,i+1,j);
    			}
    		}
    		for(int j=1;j<=m-2;j++)
    		{
    			for(int i=n-1;i<=n;i++)
    			{
    				if(mp[i][j]=='0') continue;
    				if(i==n-1)
    				{
    					zh(i,j,i,j+1,i+1,j+1);
    				}
    				else zh(i,j,i,j+1,i-1,j+1);
    			}
    		}
    		int w=0;
    		for(int i=n-1;i<=n;i++)
    		{
    			for(int j=m-1;j<=m;j++)
    			{
    				if(mp[i][j]=='1') w++;
    			}
    		}
    		if(w==1)
    		{
    			for(int i=n-1;i<=n;i++)
    			{
    				for(int j=m-1;j<=m;j++)
    				{
    					if(mp[i][j]=='1') zh1(i,j); 
    				}
    			}
    		}
    		else if(w==2)
    		{
    			int x1=0,y1=0,x2=0,y2=0,x3,y3,cnt1=0;
    			for(int i=n-1;i<=n;i++)
    			{
    				for(int j=m-1;j<=m;j++)
    				{
    					if(mp[i][j]=='1')
    					{
    						 cnt1++;
    						 mp[i][j]='0';
    						 if(cnt1==1) x1=i,y1=j;
    						 else x2=i,y2=j;
    					}
    					else x3=i,y3=j;
    				}
    			} 
    			ans[++id]=(node){x1,y1,x2,y2,x3,y3};
    			zh1(x3,y3); 
    		}
    		else if(w==3)
    		{
    			int cnt1=0,x1=0,y1=0,x2=0,y2=0,x3=0,y3=0;
    			for(int i=n-1;i<=n;i++)
    			{
    				for(int j=m-1;j<=m;j++)
    				{
    					if(mp[i][j]=='1')
    					{
    						 cnt1++;
    						 mp[i][j]='0';
    						 if(cnt1==1) x1=i,y1=j;
    						 else if(cnt1==2)x2=i,y2=j;
    						 else x3=i,y3=j;
    					} 
    				}
    			} 
    			ans[++id]=(node){x1,y1,x2,y2,x3,y3};
    		}
    		else if(w==4)
    		{
    			ans[++id]=(node){n-1,m-1,n-1,m,n,m-1};
    			zh1(n,m);
    		}
    		printf("%d\n",id);
    		for(int i=1;i<=id;i++)
    		{
    			printf("%d %d %d %d %d %d\n",ans[i].x1,ans[i].y1,ans[i].x2,ans[i].y2,ans[i].x3,ans[i].y3);
    		}
    	}
    }
/*
4 4
1 2 3
1 4
6 6
1 4 5 5 6
7 1 5 6
*/

                
            
        
浙公网安备 33010602011771号