湖南省第七届大学生计算机程序设计竞赛 多连块拼图 (模拟)

湖南省第七届大学生计算机程序设计竞赛 多连块拼图 (模拟)

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

全栈程序员社区此处内容已经被作者隐藏,请输入验证码查看内容
验证码:
请关注本站微信公众号,回复“验证码”,获取验证码。在微信里搜索“全栈程序员社区”或者“www_javaforall_cn”或者微信扫描右侧二维码都可以关注本站微信公众号。

多连块拼图

时间限制:
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\n",sovle());
    }
    return 0;
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/117909.html原文链接:https://javaforall.net

(0)
上一篇 2021年12月16日 下午8:00
下一篇 2021年12月16日 下午8:00


相关推荐

  • 我的gulp第一个程序

    我的gulp第一个程序

    2021年9月4日
    55
  • 状况与状态区别_402状态码

    状况与状态区别_402状态码http状态码301和302详解及区别一直对http状态码301和302的理解比较模糊,在遇到实际的问题和翻阅各种资料了解后,算是有了一定的理解。这里记录下,希望能有新的认识。大家也共勉。官方的比较简洁的说明:301redirect:301代表永久性转移(PermanentlyMoved)302redirect:302代表…

    2022年10月3日
    7
  • AI Agent智能体技术发展报告

    AI Agent智能体技术发展报告

    2026年3月15日
    2
  • MySQL中的注释符号的使用

    MySQL中的注释符号的使用原文地址 http paulfzm iteye com blog 前言在学习 MySQL 的过程中 因为目前接触的语法简单 所以实在没有想到过加入注释 在写博客使用 Markdown 时 突然想用注释语句 所以便百度了一下 引用了这一篇转载博客 MySQL 中的注释符号有三种 注意事项 其中 表示注释的文本内容 在使用 注释

    2025年9月5日
    7
  • ruby 常用正则表达式

    ruby 常用正则表达式

    2021年8月20日
    62
  • ArrayList初始化长度

    ArrayList初始化长度每个ArrayList实例都有一个容量,该容量是指用来存储列表元素的数组的大小。它总是至少等于列表的大小。随着向ArrayList中不断添加元素,其容量也自动增长。自动增长会带来数据向新数组的重新拷贝,因此,如果可预知数据量的多少,可在构造ArrayList时指定其容量。在添加大量元素前,应用程序也可以使用ensureCapacity操作来增加ArrayList实例的容量,这可以减少递增式再分配的…

    2025年8月12日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号