HDU 5386 Cover (MUT #8 模拟暴力)

【题目链接】:click here~~

【题意】:

操作L x y,把当前x,这一列全部置为y

操作H x y,把当前,这一行全部置为y。

现在给你n?n的初始矩阵,以及n?n的目标矩阵

现在给你m种操作(由以上两种操作构成),问怎么排序这m种操作,才能使得,初始矩阵,经由排序后的操作,构成目标矩阵。

输出排序方案。

也就是给出初始矩阵和目标矩阵,存在m中操作,可以分别把每行或者每列都涂成同一种颜色,数据保证有解,因为保证有解,(然而初始矩阵并没有什么卵用。。。)

【思路】:

暴力寻找M次操作,若目标矩阵的行或列全和该操作的颜色一样,则最后进行此操作,并把所有涂的点涂为颜色0(可当任意颜色)

然后同样依次推出之前的操作,因为之后的操作会覆盖掉之前操作的点。

PS:比赛当时居然又忽略了,

代码:

#include<bits/stdc++.h>
using namespace std;
const int N=505;
int goal[N][N];
int n,m;
inline int read(){
    int c=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){c=c*10+ch-'0';ch=getchar();}
    return c*f;
}
struct node{
    char op;
    int x,y;
} mat[N];
char s[2];
int ans[N];
int main(){
    int i,j,t;
    t=read();
    while(t--){
        memset(goal,0,sizeof(goal));
        memset(ans,0,sizeof(ans));
        int cnt,num;
        n=read();m=read();
        for( i=1; i<=n; ++i)
            for(j=1; j<=n; ++j)goal[i][j]=read();
        for(i=1; i<=n; ++i)
            for(j=1; j<=n; ++j)goal[i][j]=read();
        for(i=1; i<=m; ++i){
            scanf("%s %d %d",s,&mat[i].x,&mat[i].y);
            mat[i].op=s[0];
        }
        cnt=m;
        int c1,c2,fH=0,fL=0;
        while(cnt!=0){
            for(i=1; i<=m; ++i){
                if(mat[i].x!=0){
                      c1=mat[i].x;
                      c2=mat[i].y;
                    if(mat[i].op=='H'){
                        for(j=1; j<=n; j++)
                            if(goal[c1][j]!=0&&goal[c1][j]!=c2) break;
                        if(j==n+1){
                            for(int k=1; k<=n; k++)
                                goal[c1][k]=0;
                                 ans[cnt--]=i;
                                 mat[i].x=0;
                        }
                    }
                    else{
                        for(j=1; j<=n; j++)
                            if(goal[j][c1]!=0&&goal[j][c1]!=c2) break;
                        if(j==n+1){
                            for(int k=1; k<=n; k++)
                                goal[k][c1]=0;
                                ans[cnt--]=i;
                               mat[i].x=0;
                        }
                    }
                }
            }
        }
         for(i=1; i<=m; i++)
            printf("%d ",ans[i]);
         puts("");
    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-09-27 09:51:15

HDU 5386 Cover (MUT #8 模拟暴力)的相关文章

HDU 5386 Cover(模拟)

Cover Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 966    Accepted Submission(s): 320 Special Judge Problem Description You have an n?n matrix.Every grid has a color.Now there are two types

hdu 5386 Cover(暴力求解+想法题)

题意: 有两种操作: 操作L x y,把当前x,这一列全部置为y 操作H x y,把当前,这一行全部置为y. 现在给你n?n的初始矩阵,以及n?n的目标矩阵 现在给你m种操作(由以上两种操作构成),问怎么排序这m种操作,才能使得,初始矩阵,经由排序后的操作,构成目标矩阵. 输出排序方案. 解析: 逆向思维, 枚举每个操作,然后判断该操作是不是最后一个操作.(就像撕胶布一样,一条一条的剥离) 判断是否是最后一个操作方法就是: 除去已经用过的点,如果一排都等于当前操作的颜色,那就是最后一个操作.然后

HDU 5386 Cover

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5386 题目大意:给一个初始矩阵(n×n).一个目标矩阵(n×n)和m个操作,要求找到一种操作顺序,使初始矩阵变成目标矩阵.操作共有两种,如下: L x y: 把当前矩阵第x列的数全变为y H x y: 把当前矩阵第x行的数全变为y 输入格式:先输入case数T,每个case第一行是两个整数n和m,接下来n行输入初始矩阵,再下来n行输入目标矩阵.最后m行输入操作. 1≤color[i][j]≤n,co

HDU 5386 Cover (2015年多校比赛第8场)

1.题目描述:点击打开链接 2.解题思路:本题利用逆向思维+贪心法解决.因为题目中已经告诉我们一定存在解,因此可以考虑贪心法的使用.这道题的妙处在于答案和初始矩阵是无关的,只和目标矩阵有关.因为不管初始矩阵长什么样,只要操作一样,加上解的存在性,得到的目标矩阵一定是相同的.接下来就是如何寻找操作序列. 假设最后一步操作执行后,我们得到了目标矩阵,由于所有操作都是对一整行或者一整列进行的,因此肯定有一行或者一列全部相同.这样,我们就可以从目标矩阵出发,逆着这个过程寻找,如果发现某一行或者一列全部相

hdu 5641 King&#39;s Phone(暴力模拟题)

Problem Description In a military parade, the King sees lots of new things, including an Andriod Phone. He becomes interested in the pattern lock screen. The pattern interface is a 3×3 square lattice, the three points in the first line are labeled as

HDU 4858 项目管理(邻接表 暴力模拟)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4858 我们建造了一个大项目!这个项目有n个节点,用很多边连接起来,并且这个项目是连通的! 两个节点间可能有多条边,不过一条边的两端必然是不同的节点.每个节点都有一个能量值. 现在我们要编写一个项目管理软件,这个软件呢有两个操作:1.给某个项目的能量值加上一个特定值.2.询问跟一个项目相邻的项目的能量值之和.(如果有多条边就算多次,比如a和b有2条边,那么询问a的时候b的权值算2次). 解题报告:这个

HDU 4876 ZCC loves cards(暴力剪枝)

HDU 4876 ZCC loves cards 题目链接 题意:给定一些卡片,每个卡片上有数字,现在选k个卡片,绕成一个环,每次可以再这个环上连续选1 - k张卡片,得到他们的异或和的数,给定一个L,问能组成[L,R]所有数字的情况下,R的最大值是多少 思路:暴力C(20, 6),然后对于每个序列去全排后模拟计算值, 不过之前要有个剪枝,全排前,先把k个数随机取数(即不用连续),然后如果这样还满足不了,那么连续的情况肯定也满足不了,直接结束,不进入全排.这样一来由于满足不了的情况实际上是占绝大

hdu 4932 Miaomiao&#39;s Geometry(暴力枚举)

Miaomiao's Geometry                                                                              Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Problem Description There are N point on X-axis . Miaomiao would like

Hdu 3887树状数组+模拟栈

题目链接 Counting Offspring Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1757    Accepted Submission(s): 582 Problem Description You are given a tree, it’s root is p, and the node is numbered fr