hdu5386

题意:给你一个n*n的初始矩阵 再给你一个n*n的目标矩阵,然后有两种操作:L X Y表示将第X列全部替换成Y,H X Y表示将第X行全部替换为Y,给你m次操作让你安排顺序使得初始矩阵转换成目标矩阵,输出任意一种可行顺序

思路: 题目保证一定有解,又因为操作是整行或整列替换且初始矩阵没有用(会覆盖),所以可以假设为零矩阵,然后从目标矩阵开始通过给的操作使整行或整列变为零,直到目标矩阵变为零矩阵,然后逆序输出操作序号,过程纯暴力

代码:

#include <algorithm>
#include <iostream>
#include <sstream>
#include <cstdlib>
#include <cstring>
#include <iomanip>
#include <cstdio>
#include <string>
#include <bitset>
#include <vector>
#include <queue>
#include <stack>
#include <cmath>
#include <list>
#include <map>
#include <set>
#define sss(a,b,c) scanf("%d%d%d",&a,&b,&c)
#define mem1(a) memset(a,-1,sizeof(a))
#define mem(a) memset(a,0,sizeof(a))
#define ss(a,b) scanf("%d%d",&a,&b)
#define s(a) scanf("%d",&a)
#define p(a) printf("%d\n", a)
#define INF 0x3f3f3f3f
#define w(a) while(a)
#define PI acos(-1.0)
#define LL long long
#define eps 10E-9
#define N 3000010
#define mod 3221225473
const int SIGMA_SIZE=26;
const int MAXN=100010;
const int MAXNODE=600010;
using namespace std;
void mys(int& res) {
    int flag=0;
    char ch;
    while(!(((ch=getchar())>='0'&&ch<='9')||ch=='-'))
        if(ch==EOF)  res=INF;
    if(ch=='-')  flag=1;
    else if(ch>='0'&&ch<='9')  res=ch-'0';
    while((ch=getchar())>='0'&&ch<='9')  res=res*10+ch-'0';
    res=flag?-res:res;
}
void myp(int a) {
    if(a>9)
        myp(a/10);
    putchar(a%10+'0');
}
/*************************THE END OF TEMPLATE************************/
int arr[105][505];
int ans[505];
struct node {
    char c[2];
    int x, y;
}op[505];
int main() {
    int n, t, m;
    s(t);
    w(t--){
        ss(n, m);
        for(int i=1; i<=n; i++){
           for(int j=1; j<=n; j++) s(arr[i][j]);
        }
        for(int i=1; i<=n; i++){
            for(int j=1; j<=n; j++) s(arr[i][j]);
        }
        for(int i=1; i<=m; i++){
            scanf("%s%d%d",op[i].c,&op[i].x,&op[i].y);
        }
        int cnt=0, j;
        w(cnt<m){
            for(int i=1; i<=m; i++){
                if(!op[i].x) continue;
                int x = op[i].x;
                if(op[i].c[0] == 'L'){
                    for(j=1; j<=n; j++){
                        if(arr[j][x] && arr[j][x] != op[i].y) break;
                    }
                    if(j>n){
                        ans[++cnt] = i, op[i].x =0;
                        for(int j=1; j<=n; j++) arr[j][x] = 0;
                    }
                }
                else{
                    for( j=1; j<=n; j++){
                        if(arr[x][j] && arr[x][j] != op[i].y) break;
                    }
                    if(j>n){
                        ans[++cnt] = i, op[i].x =0;
                        for(int j=1; j<=n; j++) arr[x][j] = 0;
                    }
                }
            }
        }
        for(int i=m; i>=1; i--) printf("%d%c",ans[i],m==1?'\n':' ');
    }
    return 0;
}

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

时间: 2024-10-23 13:57:56

hdu5386的相关文章

hdu5386 棋盘涂色模拟

http://acm.hdu.edu.cn/showproblem.php?pid=5386 Problem Description You have an  matrix.Every grid has a color.Now there are two types of operating: L x y: for(int i=1;i<=n;i++)color[i][x]=y; H x y:for(int i=1;i<=n;i++)color[x][i]=y; Now give you the

hdu5386 Cover(暴力,观察)

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

hdu5386(暴力)

题意: 给出两个n*n的矩阵,一个作为初始矩阵.一个作为目标矩阵,给出m个操作,操作有两种,一种是"L,x,y".代表我们要把x这一行赋成y,还有一种是"H,x,y",代表要把x这一列赋成y.问我们怎样安排这些操作才干把初始矩阵转化成目标矩阵.输出方案.special judge 思路: 首先明白一点,初始矩阵是没实用的~,依照题解的说法.我们能够按顺序枚举全部操作,假设是L操作,我们就在目标矩阵中找一行都是y的.把这一行都更成0,同一时候把答案更新,如此往复,直至

hdu5386 Cover

Problem Description You have an  matrix.Every grid has a color.Now there are two types of operating: L x y: for(int i=1;i<=n;i++)color[i][x]=y; H x y:for(int i=1;i<=n;i++)color[x][i]=y; Now give you the initial matrix and the goal matrix.There are  

hdu5386(2015多校8)--Cover

题目链接:点击打开链接 题目大意:给出一个n*n的矩阵的初始值,和最终的值,现在有m个操作 L i j ,将第i列的值重置为j,H i j,将第i行的值重置为j.问m个操作应该怎么执行,可以完成矩阵的变化. 从最终的值向前找寻方案,每次找行和列中剩余的颜色全部相同的,看是否存在没被使用的操作可以完成它,如果有就记录下来,那么最终按照记录的逆序输出,就是可以完成变化的序列啦 #include <cstdio> #include <cstring> #include <stack

补题目录!

补补补!虽然感觉这目录会越来越长! 目录如下: 多校1: 1012/hdu5299(博弈).1009/hdu5296(数链剖分/其他).1006/hdu5293(不造) 多校2: 1004/hdu5303(贪心还是DP来的) 多校3: 1008/hdu5323(规律+模拟吧).1003/hdu5318(不造).1009/hdu5324(不造) 多校4: 1012/hdu5338(贪心+线段树之类的吧) 多校5: 1006/hdu5348.1010/hdu5352 (这场因为身体不舒服并没有打)