acwing 3762.二进制矩阵
时间:7月9日
解题思路:
对于任意位置的1可以采取3次达到变换的目的,故对于nm的矩阵最多需要3nm次
对于矩阵的中任意选取2*2矩阵都可以采取3次变换任意一个为1的地方,如图所示左上角的变法
对于最后一列和最后一行变法如图所示
为了思路的清晰定义了L的四个方向,以中心点位(i,j)变换的
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=110;
char g[N][N];
int n,m;
void pL(int i,int j,int k)//变换的四种方式
{
if (!k) printf("%d %d %d %d %d %d\n", i, j, i + 1, j, i, j + 1);
else if (k == 1) printf("%d %d %d %d %d %d\n", i, j - 1, i, j, i + 1, j);
else if (k == 2) printf("%d %d %d %d %d %d\n", i - 1, j, i, j, i, j - 1);
else printf("%d %d %d %d %d %d\n", i - 1, j, i, j, i, j + 1);
}
int main()
{
int T;
cin>>T;
while(T--)
{
cin>>n>>m;
int res=0;
for(int i=1;i<=n;i++)
{
cin>>g[i]+1;
for(int j=1;j<=m;j++)
if(g[i][j]=='1')
res+=3;
}
cout<<res<<endl;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(g[i][j]=='1')
{
if(i<n&&j<m)//普通点位
pL(i,j,0),pL(i,j+1,1),pL(i+1,j,3);
else if(i==n&&j==m)//右下角变换
pL(i,j,2),pL(i-1,j,1),pL(i,j-1,3);
else if(i==n)//最后一行
pL(i,j,3),pL(i-1,j,0),pL(i,j+1,2);
else//最后一列
pL(i,j,1),pL(i,j-1,0),pL(i+1,j,2);
}
}
return 0;
}