给出初始矩阵和目标矩阵,存在m中操作,可以分别把每行或者每列都涂成同一种颜色,数据保证有解
因为保证有解,所以初始矩阵完全没有用。。。
暴力寻找M次操作,若目标矩阵的行或列全和该操作的颜色一样,则最后进行此操作,并把所有涂的点涂为颜色0(可当任意颜色)
然后同样依次推出之前的操作,因为之后的操作会覆盖掉之前操作的点。
#include "stdio.h" #include "string.h" struct Mark { int x,y; char op; }mark[510]; int a[110][110],ans[510]; int main() { int t,n,m,i,cnt,j,k; char str[2]; scanf("%d",&t); while (t--) { scanf("%d%d",&n,&m); for (i=1;i<=n;i++) for (j=1;j<=n;j++) scanf("%d",&a[i][j]); for (i=1;i<=n;i++) for (j=1;j<=n;j++) scanf("%d",&a[i][j]); for (i=1;i<=m;i++) { scanf("%s%d%d",str,&mark[i].x,&mark[i].y); mark[i].op=str[0]; } cnt=m; while (cnt!=0) { for (i=1;i<=m;i++) if (mark[i].x!=0) { k=mark[i].x; if (mark[i].op=='H') { for (j=1;j<=n;j++) if (a[k][j]!=0 && a[k][j]!=mark[i].y) break; if (j==n+1) { for (j=1;j<=n;j++) a[k][j]=0; mark[i].x=0; ans[cnt--]=i; } } else { for (j=1;j<=n;j++) if (a[j][k]!=0 && a[j][k]!=mark[i].y) break; if (j==n+1) { for (j=1;j<=n;j++) a[j][k]=0; mark[i].x=0; ans[cnt--]=i; } } } } for (i=1;i<=m;i++) printf("%d ",ans[i]); printf("\n"); } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-10-11 22:49:58