https://codeforces.com/problemset/problem/815/A
思路:首先如果是个正方形,那么如果答案能算完,那么就是唯一的个数。
不然的话是个矩形,如果答案能算完,那么先算行和列长的一边,同样是一行/一列消1,长的一边消的更多
#include<iostream>
#include<vector>
#include<queue>
#include<cstring>
#include<cmath>
#include<map>
#include<set>
#include<cstdio>
#include<algorithm>
#define debug(a) cout<<#a<<"="<<a<<endl;
using namespace std;
const int maxn=200;
typedef long long LL;
inline LL read(){LL x=0,f=1;char ch=getchar(); while (!isdigit(ch)){if (ch=='-') f=-1;ch=getchar();}while (isdigit(ch)){x=x*10+ch-48;ch=getchar();}
return x*f;}
LL a[maxn][maxn];
LL rminv[maxn],cminv[maxn];
vector<pair<string,LL>>v;
int main(void)
{
cin.tie(0);std::ios::sync_with_stdio(false);
LL n,m;cin>>n>>m;
memset(rminv,0x3f,sizeof(rminv));memset(cminv,0x3f,sizeof(cminv));
for(LL i=1;i<=n;i++){
for(LL j=1;j<=m;j++) cin>>a[i][j];
}
for(LL i=1;i<=n;i++){
for(LL j=1;j<=m;j++){
rminv[i]=min(rminv[i],a[i][j]);
}
}
for(LL j=1;j<=m;j++){
for(LL i=1;i<=n;i++){
cminv[j]=min(cminv[j],a[i][j]);
}
}
if(n<=m){
for(LL i=1;i<=n;i++){
for(LL j=1;j<=m;j++) a[i][j]-=rminv[i];
for(LL k=1;k<=rminv[i];k++) v.push_back({"row",i});
}
for(LL j=1;j<=m;j++){
LL mx=0x3f3f3f3f;
for(LL i=1;i<=n;i++) mx=min(mx,a[i][j]);
for(LL i=1;i<=n;i++) a[i][j]-=mx;
for(LL k=1;k<=mx;k++) v.push_back({"col",j});
}
bool flag=1;
for(LL i=1;i<=n;i++){
for(LL j=1;j<=m;j++){
if(a[i][j]!=0){
flag=0;
}
}
}
if(0==flag){cout<<"-1"<<"\n";}
else{
cout<<v.size()<<"\n";
for(auto i:v){
cout<<i.first<<" "<<i.second<<"\n";
}
}
}
else{
for(LL j=1;j<=m;j++){
for(LL i=1;i<=n;i++) a[i][j]-=cminv[j];
for(LL k=1;k<=cminv[j];k++) v.push_back({"col",j});
}
for(LL i=1;i<=n;i++){
LL mx=0x3f3f3f3f;
for(LL j=1;j<=m;j++) mx=min(mx,a[i][j]);
for(LL j=1;j<=m;j++) a[i][j]-=mx;
for(LL k=1;k<=mx;k++) v.push_back({"row",i});
}
bool flag=1;
for(LL i=1;i<=n;i++){
for(LL j=1;j<=m;j++){
if(a[i][j]!=0){
flag=0;
}
}
}
if(0==flag){cout<<"-1"<<"\n";}
else{
cout<<v.size()<<"\n";
for(auto i:v){
cout<<i.first<<" "<<i.second<<"\n";
}
}
}
return 0;
}