题目链接: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,color[i][j]为数组元素。
  T=5
  1≤n≤100
  1≤m≤500

分析:根据数据范围推解题方法,此题对数组元素的大小做了限制,可以从这点下手。

  统计目标矩阵中每个数出现的次数,对列亦是。若有个操作是L x y,而目标矩阵第x列的值全是y,那显然,这个操作最后一次做是合情合理的,去掉这一列后,又是一个新问题,可以找到新的可以“最后一步”做的操作。依次类推,每次找一个合法的操作,逆序输出即可。

参考代码:

主体代码是队友写的,写的够简洁的~

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
struct node{
int t,x,y;
}b[];
int c[][][],a[][],mark[],ans[],ans2[];
char s[];
bool vis[][];
int main(){
int t,n,m;
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&m);
for(int i=;i<n;i++)
for(int j=;j<n;j++)
scanf("%d",&a[i][j]);
memset(c,,sizeof(c));
memset(mark,,sizeof(mark));
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
{
scanf("%d",&a[i][j]);
c[][j][a[i][j]]++;
c[][i][a[i][j]]++;
}
int cnt=,d[];
d[]=n;
d[]=n;
for(int i=;i<m;i++){
scanf("%s%d%d",&s,&b[i].x,&b[i].y);
if(s[]=='L') b[i].t=;
else b[i].t=;
}
memset(vis, , sizeof(vis));
for(int j=;j<m;j++)
for(int i=;i<m;i++)
if(!mark[i]){
if(d[b[i].t]==c[b[i].t][b[i].x][b[i].y])
{
if(vis[b[i].t][b[i].x]) continue;
vis[b[i].t][b[i].x] = ;
mark[i]=;
ans[m-cnt-]=i+;
cnt++;
d[b[i].t^]--;
for(int k=;k<=n;k++){
if(vis[b[i].t^][k]) continue;
if(b[i].t) c[b[i].t^][k][a[b[i].x][k]]--;
else c[b[i].t^][k][a[k][b[i].x]]--;
}
}
}
int flag=;
for(int i=;i<m;i++)
if(!mark[i]){
ans[m-cnt-]=i+;
cnt++;
}
for(int i=;i<m;i++){
if(flag==) printf(" ");
flag=;
printf("%d",ans[i]);
}
puts("");
}
}

HDU 5386 Cover的更多相关文章

  1. hdu 5386 Cover (暴力)

    hdu 5386 Cover Description You have an matrix.Every grid has a color.Now there are two types of oper ...

  2. HDU 5386 Cover(模拟)

    Cover Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Subm ...

  3. HDU 6311 Cover (无向图最小路径覆盖)

    HDU 6311 Cover (无向图最小路径覆盖) Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/ ...

  4. 暴力/思维 HDOJ 5386 Cover

    题目传送门 /* 题意:给出刷墙的所有的方法,求一种顺序,使得原矩阵刷成目标矩阵 暴力:(题解)我们只要每次找一行或一列颜色除了0都相同的,然后如果有对应的操作,就把这行这列都赋值成0即可 */ /* ...

  5. hdoj 5386 Cover

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5386 倒着推的一个挺暴力的题,看着和数学有关系,然而并没有, 不要一看到含有数学元素就考虑这是一个数学 ...

  6. HDU - 6311:Cover(欧拉回路,最少的一笔画覆盖无向图)

    The Wall has down and the King in the north has to send his soldiers to sentinel. The North can be r ...

  7. HDU 5386 暴力

    题目 也是个坑题,可惜没有发现这是个水题,被矩阵的气势吓住了,其实后来做出来的人挺多,就应该想到没那么难了.(两个队友陷入DP无法自拔,没有想换题的打算). 题意:告诉初始矩阵,目的矩阵,告诉n个步骤 ...

  8. HDU - 6311 Cover(无向图的最少路径边覆盖 欧拉路径)

    题意 给个无向图,无重边和自环,问最少需要多少路径把边覆盖了.并输出相应路径 分析 首先联通块之间是独立的,对于一个联通块内,最少路径覆盖就是  max(1,度数为奇数点的个数/2).然后就是求欧拉路 ...

  9. HDU - 6311 Cover (欧拉路径)

    题意:有最少用多少条边不重复的路径可以覆盖一个张无向图. 分析:对于一个连通块(单个点除外),如果奇度数点个数为 k,那么至少需要max{k/2,1}  条路径.将奇度数的点两两相连边(虚边),然后先 ...

随机推荐

  1. webstorm tools window

    webstorm左侧的文件列表不见了, 通过菜单,view-->tools window-->project window就可以找到

  2. linux让命令或程序在终端后台运行的方法(Ubuntu/Fedora/Centos等一样适用)

    https://segmentfault.com/a/1190000008314935

  3. Laravel 在homestead 平台上命令

    使用以下命令查看 Heroku 站点地址: $ heroku domains

  4. 设计模式-Runoob:工厂模式

    ylbtech-设计模式-Runoob:工厂模式 1.返回顶部 1. 工厂模式 工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一.这种类型的设计模式属于创建型模式,它提供 ...

  5. 在window 10查看一下指定命令行工具所在的位置

    很久之前安装过node,现在想要给node升级,通过where命令查看一下node的安装位置

  6. Openstack_通用技术_RPC 远程异步调用

    目录 目录 RPC 一个通过 HTTP Request 调用操作函数的 RPC 实现样例 环境 接收 HTTP Request RPC 调用具体的操作函数 测试 RPC RPC: 同一个项目内的不同服 ...

  7. spring boot配置项profiles active

    结论:通用项配置在applicaton.yml,区别环境配置在application-{profile}.yml中 一直不知道这个参数要不要配,配了有什么用,今天搭一个工程来检验 此项作用:用来区分不 ...

  8. appium xpath元素定位

    1.id定位 写法:driver.find_element_by_id("这里是resource-id") 2.name定位 name定位就是通过UI Automator工具查看的 ...

  9. VUE 全局监听sessionStorage变化

    在做项目的时候,可能需要在其他模块获取推送的信息或者变量,但是数据量或者说数目少,而且项目中也没有引用VUEX,那么可以下手的方法之一也就是sessionStorage类的浏览器存储了. 首先在全局的 ...

  10. sql语句中【模糊查询like的使用】

    1.like的使用: 在数据库软件中进行测试时,书写的格式是: 比如: select * from fdx.dbo.[User] where 1=1 and name like '%'+'a'+'%' ...