• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
天道铸魂
博客园    首页    新随笔    联系   管理    订阅  订阅

蓝桥杯近3年决赛题之二(16年b组)

做的时候只做对了第一题。

1、

一步之遥

从昏迷中醒来,小明发现自己被关在X星球的废矿车里。
矿车停在平直的废弃的轨道上。
他的面前是两个按钮,分别写着“F”和“B”。

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

矿车上的动力已经不太足,黄色的警示灯在默默闪烁...
每次进行 F 或 B 操作都会消耗一定的能量。
小明飞快地计算,至少要多少次操作,才能把矿车准确地停在前方1米远的地方。

请填写为了达成目标,最少需要操作的次数。

注意,需要提交的是一个整数,不要填写任何无关内容(比如:解释说明等)

答案:97

暴力即可,代码如下:

 1 #include<stdio.h>
 2 int main()
 3 {
 4     int i,j;
 5     for(i=1;i<10000;i++)
 6     {
 7         for(j=1;j<10000;j++)
 8         {
 9             if(i*97-1==j*127)
10                 printf("%d %d\n",i,j);
11         }
12     }
13     return 0;
14 }

 

2、

凑平方数

把0~9这10个数字,分成多个组,每个组恰好是一个平方数,这是能够办到的。
比如:0, 36, 5948721

再比如:
1098524736
1, 25, 6390784
0, 4, 289, 15376
等等...

注意,0可以作为独立的数字,但不能作为多位数字的开始。
分组时,必须用完所有的数字,不能重复,不能遗漏。

如果不计较小组内数据的先后顺序,请问有多少种不同的分组方案?

注意:需要提交的是一个整数,不要填写多余内容。

思路:先将10位数以内的完全平方数找出来,然后再组合,代码如下(转自https://blog.csdn.net/winter2121/article/details/72567776):

 1 #include<stdio.h>  
 2 #include<math.h>  
 3 #include<string>  
 4 using namespace std;  
 5 typedef long long ll;  
 6 ll pow2[1000];  
 7 int top=0,ans;  
 8 int check(string num)//查重  
 9 {  
10     int vis[12]={0};//标记数字的有无   
11     int len=num.length();  
12     for(int i=0;i<len;i++)  
13     {  
14         int t=num[i]-'0';  
15         vis[t]++;  
16         if(vis[t]>1)return 0;//有重复  
17     }  
18     return 1;//无重复  
19 }  
20 string zhuan(ll num)//把长整型数据转化为字符串   
21 {  
22     string s;  
23     if(num==0)s+="0";  
24     while(num)  
25     {  
26         char ch[]={num%10+'0','\0'};//临时字符串   
27         s.insert(0,ch);  
28         num/=10;  
29     }  
30     return s;  
31 }  
32 void init()//完全平方数打表  
33 {  
34     for(ll i=0;i<=100000;i++)  
35     {  
36         ll j=i*i;  
37         if(check(zhuan(j)))  
38             pow2[top++]=j;  
39     }  
40 }  
41 void dfs(int start,string num)   
42 {  
43     int len=num.length();  
44     if(len>10||check(num)==0)return;//已有重复,直接return  
45     if(len==10&&check(num))  
46     {  
47         //printf("%s\n",&num[0]);  
48         ans++;return;  
49     }  
50     for(int i=start;i<top;i++)  
51         dfs(i+1,num+zhuan(pow2[i]));  
52 }  
53 int main()  
54 {  
55     init();//完全平方数打表  
56     ans=0;  
57     dfs(0,"");  
58     printf("%d\n",ans);  
59     return 0;  
60 }

 

3、

棋子换位

有n个棋子A,n个棋子B,在棋盘上排成一行。
它们中间隔着一个空位,用“.”表示,比如:

AAA.BBB

现在需要所有的A棋子和B棋子交换位置。
移动棋子的规则是:
1. A棋子只能往右边移动,B棋子只能往左边移动。
2. 每个棋子可以移动到相邻的空位。
3. 每个棋子可以跳过相异的一个棋子落入空位(A跳过B或者B跳过A)。

AAA.BBB 可以走法:
移动A ==> AA.ABBB
移动B ==> AAAB.BB

跳走的例子:
AA.ABBB ==> AABA.BB

以下的程序完成了AB换位的功能,请仔细阅读分析源码,填写划线部分缺失的内容。

 

#include <stdio.h>
#include <string.h>

void move(char* data, int from, int to)
{
  data[to] = data[from];
  data[from] = '.';
}

int valid(char* data, int k)
{
  if(k<0 || k>=strlen(data)) return 0;
  return 1;
}

void f(char* data)
{
  int i;
  int tag;
  int dd = 0; // 移动方向

while(1){
  tag = 0;
  for(i=0; i<strlen(data); i++){
    if(data[i]=='.') continue;
    if(data[i]=='A') dd = 1;
    if(data[i]=='B') dd = -1;

    if(valid(data, i+dd) && valid(data,i+dd+dd) && data[i+dd]!=data[i] && data[i+dd+dd]=='.'){
//如果能跳...
      move(data, i, i+dd+dd);
      printf("%s\n", data);
      tag = 1;
      break;
    }
  }

  if(tag) continue;

  for(i=0; i<strlen(data); i++){
    if(data[i]=='.') continue;
    if(data[i]=='A') dd = 1;
    if(data[i]=='B') dd = -1;

    if(valid(data, i+dd) && data[i+dd]=='.'){
// 如果能移动...
      if( ______________________ ) continue; //填空位置
      move(data, i, i+dd);
      printf("%s\n", data);
      tag = 1;
      break;
    }
  }

  if(tag==0) break;
}
}

int main()
{
  char data[] = "AAA.BBB";
  f(data);
  return 0;
}

 


注意:只提交划线部分缺少的代码,不要复制已有代码或填写任何多余内容。

当时这题想半天也没思路,答案是:valid(data, i+dd+dd) && valid(data,i-dd)&&data[i+dd+dd]==data[i-dd]

如果当前要移动的字母和点的位置同时去掉后,碰到一起的字母相同,就不能移动。

 

4、

机器人塔

X星球的机器人表演拉拉队有两种服装,A和B。
他们这次表演的是搭机器人塔。

类似:

A
B B
A B A
A A B B
B B B A B
A B A B B A

队内的组塔规则是:

A 只能站在 AA 或 BB 的肩上。
B 只能站在 AB 或 BA 的肩上。

你的任务是帮助拉拉队计算一下,在给定A与B的人数时,可以组成多少种花样的塔。

输入一行两个整数 M 和 N,空格分开(0<M,N<500),分别表示A、B的人数,保证人数合理性。

要求输出一个整数,表示可以产生的花样种数。

例如:
用户输入:
1 2

程序应该输出:
3


再例如:
用户输入:
3 3

程序应该输出:
4

资源约定:
峰值内存消耗 < 256M
CPU消耗 < 1000ms

请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。

所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。

注意: main函数需要返回0
注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。
注意: 所有依赖的函数必须明确地在源文件中 #include <xxx>, 不能通过工程设置而省略常用头文件。

提交时,注意选择所期望的编译器类型。

转自https://blog.csdn.net/winter2121/article/details/72567776:

思路:根据m,n的值,最多有44层。只要每一层的第一个确定下来,这一行就是一定的。

代码:

 1 #include<stdio.h>  
 2 #include<math.h>  
 3 int a[100][100];  
 4 const int A=1;  
 5 const int B=-1;  
 6 int ans;  
 7 int tall;  
 8 void dfs(int m,int n,int i)  
 9 {  
10     if(m<0||n<0||i>tall)return;  
11     if(m==0&&n==0)  
12     {  
13         ans++;return;  
14     }  
15     for(int k=B;k<=A;k=k+2)//假设为A,B两种情况  
16     {  
17         int mm=m,nn=n;  
18         a[i][1]=k;//假设行首  
19         if(a[i][1]==A) mm--;  
20         else  nn--;  
21         if(mm<0||nn<0)continue;  
22         for(int j=2;j<=i;j++)  
23         {  
24             if(a[i-1][j-1]==A)//头顶是A,底下相同  
25             {  
26                 a[i][j]=a[i][j-1];  
27                 if(a[i][j]==A) mm--;  
28                 else  nn--;  
29             }  
30             else  //否则相异  
31             {  
32                 a[i][j]=-a[i][j-1];  
33                 if(a[i][j]==A) mm--;  
34                 else  nn--;  
35             }  
36             if(nn<0||mm<0)continue;  
37         }  
38         dfs(mm,nn,i+1);  
39     }  
40 }  
41 int main()  
42 {  
43     int m,n;  
44     scanf("%d%d",&m,&n);  
45     ans=0;  
46     tall=(sqrt(1+8*(m+n))-1)/2;  
47     dfs(m,n,1);  
48     printf("%d\n",ans);  
49     return 0;  
50  } 

 

5、


广场舞

LQ市的市民广场是一个多边形,广场上铺满了大理石的地板砖。

地板砖铺得方方正正,就像坐标轴纸一样。
以某四块砖相接的点为原点,地板砖的两条边为两个正方向,一块砖的边长为横纵坐标的单位长度,则所有横纵坐标都为整数的点都是四块砖的交点(如果在广场内)。

广场的砖单调无趣,却给跳广场舞的市民们提供了绝佳的参照物。每天傍晚,都会有大批市民前来跳舞。
舞者每次都会选一块完整的砖来跳舞,两个人不会选择同一块砖,如果一块砖在广场边上导致缺角或者边不完整,则没人会选这块砖。
(广场形状的例子参考【图1.png】)

现在,告诉你广场的形状,请帮LQ市的市长计算一下,同一时刻最多有多少市民可以在广场跳舞。

 

【输入格式】
输入的第一行包含一个整数n,表示广场是n边形的(因此有n个顶点)。
接下来n行,每行两个整数,依次表示n边形每个顶点的坐标(也就是说广场边缘拐弯的地方都在砖的顶角上。数据保证广场是一个简单多边形。

【输出格式】
输出一个整数,表示最多有多少市民可以在广场跳舞。

【样例输入】
5
3 3
6 4
4 1
1 -1
0 4

【样例输出】
7

【样例说明】
广场如图1.png所示,一共有7块完整的地板砖,因此最多能有7位市民一起跳舞。

【数据规模与约定】
对于30%的数据,n不超过100,横纵坐标的绝对值均不超过100。
对于50%的数据,n不超过1000,横纵坐标的绝对值均不超过1000。
对于100%的数据,n不超过1000,横纵坐标的绝对值均不超过100000000(一亿)。


资源约定:
峰值内存消耗 < 256M
CPU消耗 < 1000ms

请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。

所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。

注意: main函数需要返回0
注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。
注意: 所有依赖的函数必须明确地在源文件中 #include <xxx>, 不能通过工程设置而省略常用头文件。

提交时,注意选择所期望的编译器类型。

 

https://blog.csdn.net/The_best_man/article/details/71698992

 

6、


生成树计数

给定一个 n*m 的格点图,包含 n 行 m 列共 n*m 个顶点,相邻的顶点之间有一条边。
【图1.png】给出了一个3*4的格点图的例子。


如果在图中删除部分顶点和其相邻的边,如上图删除第2行第3列和第3行第1列的顶点后,如【图2.png】所示。

图的生成树指包含图中的所有顶点和其中的一部分边,使得任意两个顶点之间都有由边构成的唯一路径。如果两个生成树包含有不同的边即被认为不同,则上图中共有31种不同的生成树,其中a边不选有10种,a边选有21种。
给出格点图中保留的顶点的信息,请计算该图一共有多少种不同的生成树。

【输入格式】
输入的第一行包含两个整数n, m,用空格分隔,表示格点图的行数和列数。
接下来n行,每行m个字母(中间没有分隔字符),每个字母必然是大写E或大写N,E表示对应的顶点存在,N表示对应的顶点不存在。保证存在至少一个顶点。

【输出格式】
输出一行,包含一个整数,表示生成树的个数。答案可能很大,你只需要计算答案除以1000000007的余数即可。

【样例输入】
3 4
EEEE
EENE
NEEE

【样例输出】
31

【数据规模与约定】
对于10%的数据,1<=n<=2。
对于30%的数据,1<=n<=3。
对于40%的数据,1<=n<=4。
对于50%的数据,1<=n<=5。
另有20%的数据,1<=n*m<=12。
另有10%的数据,1<=m<=15。
对于100%的数据,1<=n<=6,1<=m<=100000。

资源约定:
峰值内存消耗 < 256M
CPU消耗 < 4500ms

请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。

所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。

注意: main函数需要返回0
注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。
注意: 所有依赖的函数必须明确地在源文件中 #include <xxx>, 不能通过工程设置而省略常用头文件。

提交时,注意选择所期望的编译器类型。

https://blog.csdn.net/qq_29963431/article/details/51236064

 

posted @ 2018-05-03 15:55  天道铸魂  阅读(333)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3