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

题意:

有两种操作:

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

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

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

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

输出排序方案。

解析:

逆向思维,

枚举每个操作,然后判断该操作是不是最后一个操作。(就像撕胶布一样,一条一条的剥离)

判断是否是最后一个操作方法就是:

除去已经用过的点,如果一排都等于当前操作的颜色,那就是最后一个操作。然后再把操作过的点给标记,重复m次。

最后逆向输出记录下的id。

my code

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int INF = 0x3f3f3f3f;
const int M = 505;
const int N = 105;
int tar[N][N];
struct Oper {
    int x, color, id;
    Oper() {}
    Oper(int x, int color, int id) : x(x), color(color), id(id) {}
} H[M], L[M];

int nh, nl, n, m;
int order[M];

bool visH[M], visL[M];

int check(int x, int color, char type) {
    if(type == ‘H‘) {
        for(int i = 1; i <= n; i++) {
            if(tar[x][i] == INF) continue;
            if(tar[x][i] != color)
                return false;
        }
    }else {
        for(int i = 1; i <= n; i++) {
            if(tar[i][x] == INF) continue;
            if(tar[i][x] != color)
                return false;
        }
    }
    return true;
}

void setColor(int x, char type) {
    if(type == ‘H‘) {
        for(int i = 1; i <= n; i++)
            tar[x][i] = INF;
    }else {
        for(int i = 1; i <= n; i++)
            tar[i][x] = INF;
    }
}

void solve() {
    int cnt = 0;
    while(cnt < m) {
        for(int i = 0; i < nh; i++) {
            if(visH[i]) continue;
            if(check(H[i].x, H[i].color, ‘H‘)) {
                setColor(H[i].x, ‘H‘);
                visH[i] = true;
                order[cnt++] = H[i].id;
            }
        }
        for(int i = 0; i < nl; i++) {
            if(visL[i]) continue;
            if(check(L[i].x, L[i].color, ‘L‘)) {
                setColor(L[i].x, ‘L‘);
                visL[i] = true;
                order[cnt++] = L[i].id;
            }
        }
    }
}

int main() {
    int T;
    scanf("%d", &T);
    while(T--) {
        scanf("%d%d", &n, &m);

        int tmp;
        for(int i = 1; i <= n; i++)
            for(int j = 1; j <= n; j++)
                scanf("%d", &tmp);

        for(int i = 1; i <= n; i++)
            for(int j = 1; j <= n; j++)
                scanf("%d", &tar[i][j]);

        memset(visH, false, sizeof(visH));
        memset(visL, false, sizeof(visL));
        nh = nl = 0;

        char oper[5];
        int x, color;
        for(int i = 1; i <= m; i++) {
            scanf("%s%d%d", oper, &x, &color);
            if(oper[0] == ‘H‘) H[nh++] = Oper(x, color, i);
            else L[nl++] = Oper(x, color, i);
        }

        solve();
        printf("%d", order[m-1]);
        for(int i = m-2; i >= 0; i--)
            printf(" %d", order[i]);
        puts("");
    }
    return 0;
}

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

时间: 2024-10-03 14:01:58

hdu 5386 Cover(暴力求解+想法题)的相关文章

HDU - 5806 NanoApe Loves Sequence Ⅱ 想法题

http://acm.hdu.edu.cn/showproblem.php?pid=5806 题意:给你一个n元素序列,求第k大的数大于等于m的子序列的个数. 题解:题目要求很奇怪,很多头绪但写不出,选择跳过的题,简称想法题. 首先考虑区间的更新方法:区间左端l不动,右端r滑动, 滑到有k个数>=m时,此区间符合条件,并且发现右端点再往右滑到底,此条件一直符合(因为若加入的数小于"第K大的数",则毫无影响.若不然,加入该数会产生一个新的第k大数,保证>="第K大

HDU 4972 Bisharp and Charizard 想法题

Bisharp and Charizard Time Limit: 1 Sec  Memory Limit: 256 MB Description Dragon is watching NBA. He loves James and Miami Heat. Here's an introduction of basketball game:http://en.wikipedia.org/wiki/Basketball. However the game in Dragon's version i

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

[题目链接]:click here~~ [题意]: 操作L x y,把当前x,这一列全部置为y 操作H x y,把当前,这一行全部置为y. 现在给你n?n的初始矩阵,以及n?n的目标矩阵 现在给你m种操作(由以上两种操作构成),问怎么排序这m种操作,才能使得,初始矩阵,经由排序后的操作,构成目标矩阵. 输出排序方案. 也就是给出初始矩阵和目标矩阵,存在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(模拟)

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 5635 ——LCP Array ——————【想法题】

LCP Array Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 830    Accepted Submission(s): 232 Problem Description Peter has a string s=s1s2...sn, let suffi=sisi+1...sn be the suffix start with 

hdu(5400)——Arithmetic Sequence(想法题)

题意: 首先,现在给出三个数字n,d1,d2.然后第二行给出n个数字. 然后题目要求的是求这个序列中有几个区间满足一下条件之一: 1)这个区间是一个等差数列,且公差为d1或d2: 2)若一个区间为[l,r],那么有l<=i<=r,使得[l,i]范围内是公差为d1的等差数列,[i,r]区间内是公差为d2的等差数列. *注意,这里单个数字一定是满足等差数列的.而且这里数字最好都使用__int64来保存,因为这个原因我们队WA了好几次. 思路: 这里我设了头和尾两个指针,分别用l和r表示. 我用de

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

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

HDU 2410 Barbara Bennett&#39;s Wild Numbers (想法题)

题目链接:HDU 2410 Barbara Bennett's Wild Numbers 题意:给出两串数w,s(长度相同),第一串中有"?",问"?"取的值使w对应的数大于s对应的数 的最大方案数. 思路:W,S一一对应比较: 遇到第一个'?'之前比较情况 1.w[i]<s[i] 方案数0种:break: 2.w[i]>s[i] break.之后有n个''?' 方案数就有10的n次方种. 3.w[i]=s[i] 继续比较,重复1.2两个条件. 遇到'?