zoukankan      html  css  js  c++  java
  • 【蓝桥杯】第六届国赛C语言B组 2.完美正方形(dfs)

    如果一些边长互不相同的正方形,可以恰好拼出一个更大的正方形,则称其为完美正方形。

    历史上,人们花了很久才找到了若干完美正方形。比如:如下边长的22个正方形
    2 3 4 6 7 8 12 13 14 15 16 17 18 21 22 23 24 26 27 28 50 60
    如【图1.png】那样组合,就是一种解法。此时,
    紧贴上边沿的是:60 50
    紧贴下边沿的是:26 28 17 21 18

    22阶完美正方形一共有8种。下面的组合是另一种:
    2 5 9 11 16 17 19 21 22 24 26 30 31 33 35 36 41 46 47 50 52 61
    如果告诉你该方案紧贴着上边沿的是从左到右依次为:47 46 61,
    你能计算出紧贴着下边沿的是哪几个正方形吗?

    请提交紧贴着下边沿的正方形的边长,从左到右,用空格分开。

    不要填写任何多余的内容或说明文字。

    搜索找到可行解并输出最后一行的正方形边长

    看了别人的博客才知道怎么写

     1 #include <cstdio>
     2 #include <cmath>
     3 #include <iostream>
     4 #include <cstring>
     5 #include <algorithm>
     6 using namespace std;
     7 int N,vis[60];
     8 int d[] = {2,5,9,11,16,17,19,21,22,24,26,30,31,33,35,36,41,50,52,46,47,61};
     9 int G[155][155];
    10 
    11 // 判断是否可以放置边长为n的正方形
    12 bool inside(int x,int y,int n)
    13 {
    14     if(!(x+n <= 155 && y+n <= 155))
    15         return false;
    16     for(int i = x;i < n+x;i++)
    17         for(int j = y;j < n+y;j++)
    18             if(G[i][j])
    19                 return false;
    20     return true;
    21 }
    22 
    23 // 将边长为n的正方形放进去或者拿走该正方形
    24 // m==0 取走   m==n 放置
    25 void Fill(int x,int y,int n,int m)
    26 {
    27     for(int i = x;i < n+x;i++)
    28         for(int j = y;j < n+y;j++)
    29             G[i][j] = m;
    30 }
    31 
    32 // 找到可以放置的坐标
    33 void Get(int &x,int &y)
    34 {
    35     for(int i = 1;i <= 154;i++)
    36         for(int j = 1;j <= 154;j++)
    37             if(!G[i][j])
    38             {
    39                 x = i;
    40                 y = j;
    41                 return ;
    42             }
    43 }
    44 
    45 // 检查大正方形是否放满
    46 bool solved()
    47 {
    48     for(int i = 1;i <= 154;i++)
    49         for(int j = 1;j <= 154;j++)
    50             if(!G[i][j])
    51                 return false;
    52     return true;
    53 }
    54 
    55 bool dfs(int x,int y)
    56 {
    57     if(solved())
    58         return true;
    59     else
    60     {
    61         Get(x,y);
    62         for(int k = 0;k < 19;k++)
    63         {
    64             if(inside(x,y,d[k]))
    65             {
    66                 if(!vis[k])
    67                 {
    68                     Fill(x,y,d[k],d[k]);
    69                     vis[k] = 1;
    70                     if(dfs(x,y+d[k]))
    71                         return true;
    72                     Fill(x,y,d[k],0);
    73                     vis[k] = 0;
    74                 }
    75             }
    76             else
    77                 break;
    78         }
    79     }
    80     return false;
    81 }
    82 
    83 int main()
    84 {    
    85     // int a[30];
    86     memset(vis,0,sizeof(vis));
    87     memset(G,0,sizeof(G));
    88     Fill(1,1,47,47);
    89     Fill(1,48,46,46);
    90     Fill(1,94,61,61);
    91     sort(d,d+19);
    92     dfs(1,1);
    93 
    94     for(int i = 1;i <= 154;i++)
    95         cout << G[154][i] << ' ';
    96 
    97     return 0;
    98 }
    文章搬运自我的个人博客http://duny31030.top 原博客为静态博客,因备份丢失无法继续更新,所以又搬运回博客园,可能部分文章阅读体验不好,可以到我的静态博客搜索相同标题查看
  • 相关阅读:
    docker 安装镜像
    Vagrant+Oracle VM VirtualBox创建linux虚拟机(centos7)
    idea配置git,github , gitee
    idea连接数据库
    idea基本设置
    git基础命令
    mybatis中的where
    重学 Java 设计模式:实战桥接模式(多支付渠道「微信、支付宝」与多支付模式「刷脸、指纹」场景)
    HTTPS加密原理
    优惠券数据库设计
  • 原文地址:https://www.cnblogs.com/duny31030/p/9069925.html
Copyright © 2011-2022 走看看