hdu5319 简单模拟

题意很好懂,大致就是三种颜色,红和蓝一起会变绿,给个终态矩阵,问从原始状态到终态最少画几笔?  按一定规则画

思路就是记红为1,蓝为2,绿为3,先遍历绿色,针对每一块绿色进行删除,每找到一块绿色,首先将它置零,然后主对角线上和它挨着的红色或绿色-1,副对角线上和它挨着的蓝色或绿色-2,ans+2; 知道所有绿色遍历完为止。然后在遍历剩余的红色和蓝色,红色块主对角线上和它挨着的红色-1(包括它)ans+1,绿色副对角线上和它挨着的蓝色-2(包括它)ans+1。  最后输出ans即可。

#include<cstdio>
#include<cstring>
#include<iostream>

using namespace std;

int n,m;
int g[51][51];
int ans=0;
void dfs_1(int x,int y)  //左上
{
    while(g[x][y]==1||g[x][y]==3)
    {
     //   puts("1");
        g[x][y]--;
        x--;
        y--;
    }
}
void dfs_2(int x,int y)  // 右下
{
    while(g[x][y]==1||g[x][y]==3)
    {
    //    puts("1");
        g[x][y]--;
        x++;
        y++;
    }
}
void dfs_3(int x,int y)  // 左下
{
    while(g[x][y]==2||g[x][y]==3)
    {
     //   puts("1");
        g[x][y]-=2;
        x++;
        y--;
    }
}
void dfs_4(int x,int y)  // 右上
{
    while(g[x][y]==2||g[x][y]==3)
    {
    //    puts("1");
        g[x][y]-=2;
        x--;
        y++;
    }
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        ans=0;
        memset(g,0,sizeof(g));
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
        {
            char cc[51];
            memset(cc,‘\0‘,sizeof(cc));
            scanf("%s",cc);
            m=strlen(cc);
            for(int j=0;j<m;j++)
            {
                if(cc[j]==‘R‘) g[i][j+1]=1;
                if(cc[j]==‘B‘) g[i][j+1]=2;
                if(cc[j]==‘G‘) g[i][j+1]=3;
            }
        }
        for(int a=1;a<=n;a++)
        {
            for(int b=1;b<=m;b++)
            {
                if(g[a][b]==3)
                {
                    g[a][b]=0;
                    dfs_1(a-1,b-1);
                    dfs_2(a+1,b+1);
                    dfs_3(a+1,b-1);
                    dfs_4(a-1,b+1);
                    ans+=2;
                }
            }
        }
        for(int c=1;c<=n;c++)
        {
            for(int d=1;d<=m;d++)
            {
                if(g[c][d]==1)
                {
                    g[c][d]=0;
                    dfs_1(c-1,d-1);
                    dfs_2(c+1,d+1);
                    ans++;
                }
                else if(g[c][d]==2)
                {
                    g[c][d]=2;
                    dfs_3(c+1,d-1);
                    dfs_4(c-1,d+1);
                    ans++;
                }
            }
        }
        printf("%d\n",ans);
    }
}
时间: 2024-11-06 21:22:34

hdu5319 简单模拟的相关文章

HDU-1034-Candy Sharing Game(C++ &amp;&amp; 简单模拟)

Candy Sharing Game Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 3703    Accepted Submission(s): 2311 Problem Description A number of students sit in a circle facing their teacher in the cent

Jquery源码分析与简单模拟实现

前言 最近学习了一下jQuery源码,顺便总结一下,版本:v2.0.3 主要是通过简单模拟实现jQuery的封装/调用.选择器.类级别扩展等.加深对js/Jquery的理解. 正文 先来说问题: 1.jQuery为什么能使用$的方式调用,$是什么.$()又是什么.链式调用如何实现的 2.jQuery的类级别的扩展内部是怎样实现的,方法级别的扩展有是怎样实现的,$.fn又是什么 3.jQuery选择器是如何执行的,又是如何将结果包装并返回的 带着这些问题,我们进行jquery的模拟实现,文章下方有

Linux 内核 链表 的简单模拟(2)

接上一篇Linux 内核 链表 的简单模拟(1) 第五章:Linux内核链表的遍历 /** * list_for_each - iterate over a list * @pos: the &struct list_head to use as a loop cursor. * @head: the head for your list. */ #define list_for_each(pos, head) for (pos = (head)->next; pos != (head);

HDU 1048 What Is Your Grade? (简单模拟)

 What Is Your Grade? Problem Description "Point, point, life of student!" This is a ballad(歌谣)well known in colleges, and you must care about your score in this exam too. How many points can you get? Now, I told you the rules which are used in

JavaWeb学习总结(四十九)——简单模拟Sping MVC

在Spring MVC中,将一个普通的java类标注上Controller注解之后,再将类中的方法使用RequestMapping注解标注,那么这个普通的java类就够处理Web请求,示例代码如下: 1 /** 2 * 使用Controller注解标注LoginUI类 3 */ 4 @Controller 5 public class LoginUI { 6 7 //使用RequestMapping注解指明forward1方法的访问路径 8 @RequestMapping("LoginUI/Lo

简单模拟Hibernate的主要功能实现

在学习期间接触到Hibernate框架,这是一款非常优秀的O/R映射框架,大大简化了在开发web项目过程中对数据库的操作.这里就简单模拟其底层的实现. /*******代码部分,及其主要注解**********************/1.实体类User:public class User {    private int id;    private String username;    private String password; public int getId() {       

ZOJ 3804 YY&#39;s Minions (简单模拟)

1 /* 2 题意:一个矩阵中有 n*m个宠物,每一个宠物都有一个状态, 1醒着的,0睡着的 3 X离开的!如果这个宠物(醒着的)的周围醒着的个数>3 || <2它就会睡着, 4 如果这个宠物(睡着的)的周围醒着的个数==3就会醒来! 5 每一分钟都会有变换一个状态! 6 其中会有些宠物会在给定的时间内离开! 7 */ 8 #include<iostream> 9 #include<cstring> 10 #include<cstdio> 11 #inclu

Codeforces Round #259 (Div. 2) (简单模拟实现题)

题目链接:http://codeforces.com/problemset/problem/454/A A. Little Pony and Crystal Mine time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output Twilight Sparkle once got a crystal from the Crystal Mine

HDU 4891 简单模拟

The Great Pan Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 1035    Accepted Submission(s): 355 Problem Description As a programming contest addict, Waybl is always happy to take part in vario