AcWing 3762. 二进制矩阵 原题链接
思路:
暴力解法,不是最优解,九宫格,分四种情况,右下角最后一个格子,最后一列,最后一行,其他情况,四个格子做三次交换就可以只把其中一个格子改变,其余三个不变
AC代码:
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 110;
int n,m;
char g[N][N];
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+1,j,3),pl(i,j+1,1);
}
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+1,j,2),pl(i,j-1,0);
}
}
}
}
}