zoukankan      html  css  js  c++  java
  • 蓝桥杯 搜索

    完美正方形


     

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

    历史上,人们花了很久才找到了若干完美正方形。比如:如下边长的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<iostream>
     2 #include<cstring>
     3 
     4 using namespace std;
     5 
     6 
     7 const int maxn=154;
     8 int Num[]={2,5,9,11,16,17,19,21,22,24,26,30,31,33,35,36,41,50,52};
     9 int mp[maxn][maxn];
    10 bool vis[22]={0};
    11 
    12 bool isPushMx(int x,int y,int val){
    13     if(val+x>maxn||val+y>maxn)
    14         return false;
    15     for(int i=x;i<val+x;i++){
    16         for(int j=y;j<val+y;j++){
    17             if(mp[i][j])
    18                 return false;
    19         }
    20     }
    21     return true;
    22 }
    23 
    24 void PushMx(int x,int y,int val,bool OnOff){
    25     for(int i=x;i<val+x;i++){
    26         for(int j=y;j<val+y;j++){
    27             mp[i][j]=(OnOff==1?val:0);
    28         }
    29     }
    30 }
    31 
    32 
    33 void Getxy(int& x,int&y){
    34     for(int i=0;i<maxn;i++)
    35         for(int j=0;j<maxn;j++)
    36             if(!mp[i][j]){        
    37                 x=i,y=j;
    38                 return ;
    39     }
    40 }
    41 
    42 bool solve(){
    43     for(int i=0;i<maxn;i++)
    44         for(int j=0;j<maxn;j++)    
    45             if(!mp[i][j])return false;
    46     return true;
    47 }    
    48 // 
    49 bool dfs(int x,int y){
    50     if(solve())return true;
    51     else{
    52         Getxy(x,y);
    53         for(int i=0;i<19;i++){
    54             if(isPushMx(x,y,Num[i])){
    55                 if(!vis[i]){
    56                     vis[i]=1;
    57                     PushMx(x,y,Num[i],1);
    58                 //    cout<<x<<' '<<y<<' '<<Num[i]<<endl;
    59                     if(dfs(x,y))return true;
    60                     PushMx(x,y,Num[i],0);
    61                     vis[i]=0;
    62                 }
    63             }
    64             else break;
    65         }
    66         
    67     }    
    68     return false;
    69 //    getchar();
    70     
    71 }
    72 
    73 int main(){
    74     memset(vis,0,sizeof(vis));
    75     memset(mp,0,sizeof(mp));
    76     PushMx(0,0,47,1);    
    77     PushMx(0,47,46,1);
    78     PushMx(0,93,61,1);
    79     dfs(0,0);
    80     for(int i=0;i<maxn;i++){
    81             cout<<mp[153][i];
    82     }    
    83     cout<<endl;
    84     return 0;
    85     
    86 }
    View Code

    一步之遥


     

     从昏迷中醒来,小明发现自己被关在X星球的废矿车里。

    矿车停在平直的废弃的轨道上。
    他的面前是两个按钮,分别写着“F”和“B”。

    小明突然记起来,这两个按钮可以控制矿车在轨道上前进和后退。
    按F会前进97米。按B会后退127米。
    透过昏暗的灯光,小明看到自己前方1米远正好有个监控探头。
    他必须设法使得矿车正好停在摄像头的下方,才有机会争取同伴的援助。
    或许,通过多次操作F和B可以办到。

    每次进行 F 或 B 操作都会消耗一定的能量。
    小明飞快地计算,至少要多少次操作,才能把矿车准确地停在前方1米远的地方。

    解题思路:

    法1:理解为 Fx-By=1,求x+y的最小值 

    法2:BFS,只有两个方向,

        向前F米,向后B米

     1 #include<iostream>
     2 #include<cstring>
     3 #include<queue>
     4 
     5 using namespace std;
     6 
     7 #define F 97
     8 #define B -127
     9 
    10 const int maxn=1e6;
    11 bool vis[maxn*2];
    12 
    13 struct XM{
    14     int step,val;
    15     XM():step(0),val(0){}
    16 };
    17 
    18 void bfs(){
    19     queue<XM>que;
    20     que.push(XM());
    21     while(!que.empty()){
    22         XM head,tail;
    23         head=que.front();
    24         que.pop();
    25         for(int i=1;i<=2;i++){
    26             if(i==1)
    27                 tail.val=head.val+F;
    28             else
    29                 tail.val=head.val+B;
    30             if(!vis[tail.val+maxn]&&tail.val<maxn&&tail.val>-maxn){
    31                 vis[tail.val+maxn]=1;
    32                 tail.step=head.step+1;
    33                 que.push(tail);
    34             }
    35             if(tail.val==1){
    36             cout<<tail.step<<endl;
    37             while(!que.empty())
    38                 que.pop();
    39                 return ;
    40             }
    41         }
    42     }
    43 }
    44 
    45 int main(){
    46     memset(vis,0,sizeof(vis));
    47     bfs();
    48     return 0;
    49 }
    View Code
  • 相关阅读:
    解决 WordPress 后台加载非常缓慢/打不开问题
    PHP 数组函数 内部指针
    date picker with jquery
    PHP is_file() 函数
    redis 应用场景-转载
    mvc 伪静态 *html IIS 部署 404 错误
    记录7: office 2016 Mac不能使用的解决过程
    send_keys results in Expected 【object Undefined】undefined to be a string解决方法:更新selenium+geckodriver+firefox
    记录1-更换mac pro内存,硬盘及恢复系统
    记录2-在mac上安装ubuntu 16.04 LTS
  • 原文地址:https://www.cnblogs.com/Y292/p/10895748.html
Copyright © 2011-2022 走看看