hdu5386Cover 暴力枚举

//给一个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 ;
}

你可能感兴趣的:(暴力)