给你一个矩阵,一开始都是零,让你通过只能刷一行或者一列的方式,把开始的矩阵刷乘给你的矩阵:
考虑最优解:
例如:
3 4 4 3
1 1 1 1 1 1 1
1 1 1 1 1 1 1
1 1 1 1 1 1 1
1 1 1
#include <iostream> #include<string.h> #include<cstdio> #include<algorithm> using namespace std; typedef long long ll; int main() { int m,n,ge,a[110][110],t=0,t1=0,row[110000],b[110][110],col[110000],i,j,minn; scanf("%d%d",&n,&m); for(i=0; i<=n-1; i++) for(j=0; j<=m-1; j++) { scanf("%d",&a[i][j]); } if(n<=m) { for(i=0; i<=n-1; i++) { ge=0; minn=0x3f3f3f3f; for(j=0; j<=m-1; j++) { if(a[i][j]>=1) ge++; minn=min(minn,a[i][j]); } if(ge==m) { for(int k=1; k<=minn; k++) row[t++]=i+1; for(j=0; j<=m-1; j++) b[i][j]+=minn; } } /* for(i=0;i<=n-1;i++) for(j=0;j<=m-1;j++) { if(j==m-1) printf("%d ",b[i][j]); else printf("%d ",b[i][j]); }*/ for(j=0; j<=m-1; j++) { ge=0; minn=0x3f3f3f3f; int p=a[0][j]-b[0][j]; for(i=0; i<=n-1; i++) { if(a[i][j]-b[i][j]==p) ge++; } if(ge!=n&&ge!=0) { printf("-1 "); return 0; } else { for(int k=1; k<=p; k++) col[t1++]=j+1; for(i=0; i<=n-1; i++) b[i][j]+=p; } } int flag=0; for(i=0; i<=n-1; i++) { for(j=0; j<=m-1; j++) { if(a[i][j]!=b[i][j]) { flag=1; } } } if(flag==1) printf("-1 "); else { printf("%d ",t1+t); for(i=0; i<=t-1; i++) printf("row %d ",row[i]); for(i=0; i<=t1-1; i++) printf("col %d ",col[i]); } } else { for(j=0; j<=m-1; j++) { ge=0; minn=0x3f3f3f3f; for(i=0; i<=n-1; i++) { if(a[i][j]>=1) ge++; minn=min(minn,a[i][j]); } if(ge==n) { for(int k=1; k<=minn; k++) col[t1++]=j+1; for(i=0; i<=n-1; i++) b[i][j]+=minn; } } /* for(i=0;i<=n-1;i++) for(j=0;j<=m-1;j++) { if(j==m-1) printf("%d ",b[i][j]); else printf("%d ",b[i][j]); }*/ for(i=0; i<=n-1; i++) { ge=0; minn=0x3f3f3f3f; int p=a[i][0]-b[i][0]; for(j=0; j<=m-1; j++) { if(a[i][j]-b[i][j]==p) ge++; } if(ge!=m&&ge!=0) { printf("-1 "); return 0; } else { for(int k=1; k<=p; k++) row[t++]=i+1; for(j=0; j<=m-1; j++) b[i][j]+=p; } } int flag=0; for(i=0; i<=n-1; i++) { for(j=0; j<=m-1; j++) { if(a[i][j]!=b[i][j]) { flag=1; } } } if(flag==1) printf("-1 "); else { printf("%d ",t1+t); for(i=0; i<=t1-1; i++) printf("col %d ",col[i]); for(i=0; i<=t-1; i++) printf("row %d ",row[i]); } } }