zoukankan      html  css  js  c++  java
  • 湖南省第七届大学生计算机程序设计竞赛 多连块拼图 (模拟)

    多连块拼图

    时间限制:1000 ms  |  内存限制:65535 KB
    难度:4
    描写叙述
        多连块是指由多个等大正方形边与边连接而成的平面连通图形。         ———— 维基百科 

        给一个大多连块和小多连块,你的任务是推断大多连块能否够由两个这种小多连块拼成。小多连块仅仅能平移,不能旋转或者翻转。两个小多连块不得重叠。左下图是一个合法的拼法,但右边两幅图都非法。中间那幅图的问题在于当中一个小多连块旋转了,而右图更离谱:拼在一起的那两个多连块根本就不是那个给定的小多连块(给定的小多连块画在右下方)。 

    输入
    输入最多包括 20 组測试数据。每组数据第一行为两个整数 n 和 m(1<=m<=n<=10)。下面 n 行描写叙述大多连块,当中每行恰好包括 n 个字符*或者.,当中*表示属于多连块,.表示不属于。下面 m 行为小多连块,格式同大多连块。输入保证是合法的多连块(注意,多连块至少包括一个正方形)。输入结束标志为 n=m=0。
    输出
    对于每组測试数据,假设能够拼成,输出 1,否则输出 0。
    例子输入
    4 3 
    .**. 
    **** 
    .**. 
    .... 
    **. 
    .** 
    ... 
    3 3 
    *** 
    *.* 
    *** 
    *.. 
    *.. 
    **. 
    4 2 
    **** 
    .... 
    .... 
    .... 
    *. 
    *. 
    0 0 
    例子输出
    1 
    0 
    0
    来源

    湖南省第七届大学生计算机程序设计竞赛


    这道能够算是一道模拟题吧,利用给出的小多连块,进行平移,去匹配大多连快的内容,看能否匹配成功,这里我们能够採用模拟它进行匹配,记录大,小多连块的第一个‘*’的位置,然后用小连块去进行匹配,就相当于去消除大多连块的‘*’,逐个枚举进行匹配;要学习这样的匹配和枚举的方法;

    #include <cstdio>
    #include <cstring>
    using namespace std;
    char map[10][10],s[10][10];
    int x1,y1,x2,y2,n,m;
    void get_big()//获得大多连块的第一个‘*’位置
    {
        bool flag=true;
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<n;j++)
            {
                if(s[i][j]=='*')
                {
                    x1=i;
                    y1=j;
                    flag=false;
                    break;
                }
            }
             if(!flag) break;
        }
    }
    void get_small()//获得小多连块的第一个‘*’位置
    {
        bool flag=true;
        for(int i=0;i<m;i++)
        {
            for(int j=0;j<m;j++)
            {
                if(map[i][j]=='*')
                {
                    x2=i;
                    y2=j;
                    flag=false;
                    break;
                }
            }
            if(!flag) break;
        }
    }
    bool judge()//推断是否所有匹配
    {
        for(int i=0;i<n;i++)
            for(int j=0;j<n;j++)
            if(s[i][j]=='*')
            return false;
        return true;
    }
    int sovle()//匹配过程
    {
        get_small();
        while(!judge())
        {
            get_big();
            for(int i=x2;i<m;i++)
                for(int j=0;j<m;j++)
            {
                if(map[i][j]=='*')
                {
                     if(s[x1+i-x2][y1+j-y2]=='*')//关键就是这里,用小连块的位置去匹配大连块的位置
                            s[x1+i-x2][y1+j-y2]='.';
                    else
                        return 0;
                }
            }
        }
        return 1;
    }
    int main()
    {
        int i,j;
        while(scanf("%d%d",&n,&m)&&n&&m)
        {
            for(i=0;i<n;i++)
              scanf("%s",s[i]);
            for(j=0;j<m;j++)
              scanf("%s",map[j]);
            printf("%d
    ",sovle());
        }
        return 0;
    }
    


  • 相关阅读:
    HTML3 / 4 / 4.1 / 5 版本升级过程中,变化是怎么样的
    HTML head内所有标签,及其作用
    HTML 和 XHTML和区别
    HTML DOCTYPE 都有哪些,它们之前的区别和用途分别是什么?
    eclipse中英文切换--四种方式
    Eclipse Class Decompiler---Java反编译插件
    jdk历史版本下载
    eclipse优化(部分)
    博客迁移到github
    JavaScript:同步、异步和事件循环
  • 原文地址:https://www.cnblogs.com/yxwkf/p/4551555.html
Copyright © 2011-2022 走看看