• 2015 多校联赛 ——HDU5386(暴力)


    Sample Input
    1 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
     
    Sample Output
    5 2 4 3 1


    给你一个初始矩阵和目标矩阵,包含‘L’ , ' H' 两个操作, ‘L x y’  表示把第x列全赋值成y, ‘Hx y’  表示把第x行全赋值成y。

    求怎样的顺序可以得出目标矩阵。

    倒着求解,在目标矩阵上你肯定能找到最后一个操作,这样倒推出答案即可


    #include<iostream>
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include<math.h>
    #include<vector>
    #include<map>
    #include<set>
    #include<queue>
    #include<stack>
    #include<string>
    #include<algorithm>
    using namespace std;
    #define maxn 200050
    
    int T,n,m,t,k,l,tot,j;
    int a[105][105];
    int b[505],c[505],ans[505];
    char p[505],ch;
    
    int main()
    {
        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]);
    
            t = 0;
            tot = 0;
            for(int i = 1; i <= m; i++)
            {
                for(ch=getchar(); ch!='H'&&ch!='L'; ch=getchar());
                p[i] = ch;
                scanf("%d%d",&b[i],&c[i]);
            }
    
            while(tot < m)
            {
                for(int i=1;i<=m;++i)
                if(b[i])
                {
                    int t = b[i];
                    if(p[i] == 'L')
                    {
                        for(j = 1; j <= n; j++)
                            if(a[j][t] && a[j][t] != c[i])
                                break;
                        if(j > n)
                        {
                            for(int j = 1; j <= n; j++)
                                a[j][t] = 0;
                            b[i] = 0;
                            ans[tot++] = i;
                        }
                    }
                    else
                    {
                        for(j = 1; j <= n; j++)
                            if(a[t][j] && a[t][j] != c[i])
                                break;
                        if(j > n)
                        {
                            for(int j = 1; j <= n; j++)
                                a[t][j] = 0;
                            b[i] = 0;
                            ans[tot++] = i;
                        }
                    }
                }
            }
    
            for(int i=m-1; i>=0; --i)printf("%d ",ans[i]);
            printf("
    ");
        }
        return 0;
    }
    

      

  • 相关阅读:
    web安全
    WCF通信架构
    WCF地址
    WCFContracts(契约)
    分布式中的王者WCF
    SOAP 介绍
    诊所管理软件
    MFC 画图CDC双缓冲
    Linux 启动、关闭、重启网络服务
    C# 除法的小数点问题
  • 原文地址:https://www.cnblogs.com/Przz/p/5409782.html
Copyright © 2020-2023  润新知