hdu5386Cover 暴力枚举

来源:互联网 发布:养生源码 编辑:程序博客网 时间:2024/06/10 11:00
//给一个n*n的矩阵,m个操作,问怎样安排顺序使得//这个变为目标矩阵//因为n<=100所以直接枚举所有操作,直接判断该操作是否为最后一个操作//对于已经处理完的操作,将该行或列置为0,后来的操作不处理这些操作#include<cstdio>#include<cstring>#include<iostream>#include<vector>using namespace std ;const int maxn = 510 ;int map[maxn][maxn] ;int solve[maxn] ;int ans[maxn] ;int match[maxn] ;char ch[maxn][10];int x[maxn] ,y[maxn] ;int vis[2][maxn] ;int n , m;int main(){    //freopen("in.txt" , "r" , stdin) ;    int t ;    scanf("%d" , &t) ;    while(t--)    {        scanf("%d%d" , &n , &m) ;        memset(solve , 0 , sizeof(solve)) ;        memset(vis , 0 , sizeof(vis)) ;        for(int i = 1;i <= n;i++)          for(int j = 1;j <= n;j++)            scanf("%d"  , &map[i][j]) ;        for(int i = 1;i <= n;i++)           for(int j = 1;j <= n;j++)             scanf("%d" , &map[i][j]) ;        for(int i = 1;i <= m;i++)             scanf("%s%d%d" ,ch[i] , &x[i] , &y[i]) ;        int len = 0 ;        while(1)        {            int flag = 0 ;            for(int i = 1;i <= m;i++)            {                if(solve[i])continue ;                if(ch[i][0] == 'H')                {                    if(vis[0][x[i]])                    {                        ans[++len] = i ;                        solve[i] = 1 ;                        continue ;                    }                    int tmp = 0 ;                    for(int j = 1;j <= n;j++)                    if(map[x[i]][j] != y[i] && map[x[i]][j])                    {                        tmp = 1;                        break ;                    }                    if(!tmp)                    {                       ans[++len] = i ;                       solve[i] = vis[0][x[i]] = 1;                       memset(map[x[i]] , 0 , sizeof(map[x[i]])) ;                       flag = 1 ;                    }                }                else                {                    if(vis[1][x[i]])                    {                        ans[++len] = i ;                        solve[i] = 1 ;                        continue ;                    }                    int tmp = 0 ;                    for(int j = 1;j <= n;j++)                    if(map[j][x[i]] != y[i] && map[j][x[i]])                    {                        tmp = 1;                        break ;                    }                    if(!tmp)                    {                        ans[++len] = i ;                        solve[i] = vis[1][x[i]] = 1;                        for(int j = 1;j <= n;j++)                        map[j][x[i]] = 0 ;                        flag = 1;                    }                }            }            if(!flag)break ;        }        for(int i = 1;i <= m;i++)        if(!solve[i])        ans[++len] = i ;        for(int i = m;i > 0;i--)        printf("%d%c" , ans[i] , i == 1 ?'\n' :' ') ;    }    return 0 ;}
0 0