Description
给定一个 (n imes n imes n) 的矩阵,每次可以指定一个点进行染色,所有与这个点在同一行、同一列、同一纵列的所有格子都会被染色。求最少要对多少个格子进行操作才能将整个阵列染黑,并且输出方案。
Solution
考虑这样一种方式,令 (n = x + y),则我们只需要对角线位置的两个 (x imes x imes x) 和 (y imes y imes y) 操作,且对于每个被操作的 (i,j,k) 满足 (k=(i+j) mod x) (这里指的是前者,后者同理),那么整个矩形就一定可以被染色。
不妨取 (x = [n/2]),此时答案一定取得最小。
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1000005;
int n,x,y;
signed main()
{
cin>>n;
x=n/2;
y=n-x;
cout<<x*x+y*y<<endl;
for(int i=1;i<=x;i++)
{
for(int j=1;j<=x;j++)
{
cout<<i<<" "<<j<<" "<<(i+j)%x+1<<endl;
}
}
for(int i=1;i<=y;i++)
{
for(int j=1;j<=y;j++)
{
cout<<x+i<<" "<<x+j<<" "<<x+(i+j)%y+1<<endl;
}
}
system("pause");
}