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
*/

  

posted on 2015-10-04 20:25  wzb_hust  阅读(140)  评论(0编辑  收藏  举报

导航