HDU5386 Cover
1007.Cover
水题,我们只要每次找一行或一列颜色除了00都相同的,然后如果有对应的操作,就把这行这列都赋值成00即可
其实初始矩阵并没有什么卵用
稍微优化下复杂度是O(n^2)O(n2)的,但是为了简易些范围开到了100100
不知道哪里写错了。。一直WR
#include<bits/stdc++.h> #define N 110 #define M 510 int a[M][M]; char c[M][5]; int x[M],y[M],ans[M]; bool flag[M]; bool used[M][M]; using namespace std; int main() { int T,n,m; scanf("%d",&T); while(T--) { scanf("%d%d",&n,&m); for (int i=1;i<=n;i++) for (int j=1;j<=n;j++) scanf("%d",&a[i][j]); for (int i=1;i<=n;i++) for (int j=1;j<=n;j++) scanf("%d",&a[i][j]); for (int i=1;i<=m;i++) { scanf("%s%d%d",c[i],&x[i],&y[i]); } memset(flag,false,sizeof(flag)); memset(used,false,sizeof(used)); for (int k=m;k>=1;k--) { for (int j=1;j<=m;j++) if (!flag[j]) { bool ok=true; if (c[j][0]=='H') { for (int i=1;i<=n;i++) if (a[x[j]][i]!=y[j]&&!used[x[j]][i]) {ok=false; break;} } else { for (int i=1;i<=n;i++) if (a[i][x[j]]!=y[j]&&!used[i][x[j]]) {ok=false; break;} } if (ok) { flag[j]=true; ans[j]=k; if (c[j][0]=='H') for (int i=1;i<=n;i++) used[x[j]][i]=true; else for (int i=1;i<=n;i++) used[i][x[j]]=true; break; } } } for (int i=1;i<=m;i++) if (i==m) printf("%d\n",ans[i]); else printf("%d ",ans[i]); } } /* 2 3 5 2 2 1 2 3 3 2 1 3 1 1 1 2 2 2 3 3 3 L 2 3 H 1 1 L 2 3 H 3 3 H 2 2 3 5 2 2 1 2 3 3 2 1 3 3 3 3 3 3 3 3 3 3 H 2 3 L 2 2 H 3 3 H 1 3 L 2 3 */