第八届蓝桥杯C语言

本文介绍了蓝桥杯编程竞赛中涉及的C语言题目,包括迷宫问题、字母组串计数、最大公共子串求解、正则表达式最长匹配长度、分巧克力策略、油漆面积计算等。通过实例解析了各题目的解题思路和关键代码实现,适合提升C语言编程能力和算法理解。
摘要由CSDN通过智能技术生成

A组

1.标题:迷宫

X星球的一处迷宫游乐场建在某个小山坡上。
它是由10x10相互连通的小房间组成的。

房间的地板上写着一个很大的字母。
我们假设玩家是面朝上坡的方向站立,则:
L表示走到左边的房间,
R表示走到右边的房间,
U表示走到上坡方向的房间,
D表示走到下坡方向的房间。

X星球的居民有点懒,不愿意费力思考。
他们更喜欢玩运气类的游戏。这个游戏也是如此!

开始的时候,直升机把100名玩家放入一个个小房间内。
玩家一定要按照地上的字母移动。

迷宫地图如下:
------------
UDDLUULRUL
UURLLLRRRU
RRUURLDLRD
RUDDDDUUUU
URUDLLRRUU
DURLRLDLRL
ULLURLLRDU
RDLULLRDDD
UUDDUDUDLL
ULRDLUURRR
------------

请你计算一下,最后,有多少玩家会走出迷宫? 
而不是在里边兜圈子。请提交该整数,表示走出迷宫的玩家数目,不要填写任何多余的内容

这个题就是用一个switch开关来控制四个方向,再用一个数组来记录走过的位置,要是走到一个走过的位置,就是陷入循环走不出来了。

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

char* arr = "UDDLUULRULUURLLLRRRURRUURLDLRDRUDDDDUUUUURUDLLRRUUDURLRLDLRLULLURLLRDURDLULLRDDDUUDDUDUDLLULRDLUURRR";
int i = 0;
int j = 0;
char a[10][10];
int ans = 0;
int visit[10][10];

int walk(const int people)
{
    memset(visit,0,sizeof(visit));
    int x = people / 10;
    int y = people % 10;
    while (1)
    {
        if (visit[x][y])
        {
            return 0;
        }
        visit[x][y] = 1;
        switch (a[x][y])
        {
        case 'L':
            --y;
            break;
        case 'R':
            ++y;
            break;
        case 'U':
            --x;
            break;
        case 'D':
            ++x;
            break;
        }
        if (x<0 || x>9 || y<0 || y>9)
        {
            return 1;
        }
    }
}

void slove()
{
    int people = 1;
    for (people = 1; people <= 100; people++)
    {
        if (walk(people))
        {
            ans++;
        }
    }
}

int main()
{
    int count = 0;
    for (i = 0; i < 10; i++)
    {
        for (j = 0; j < 10; j++)
        {
            a[i][j] = arr[count];
            count++;
        }
    }
    slove();
    printf("%d", ans);
    return 0;
}

2.蚂蚱  3.魔方  4.方格分割(放弃)


5.标题:字母组串

由 A,B,C 这3个字母就可以组成许多串。
比如:"A","AB","ABC","ABA","AACBB" ....

现在,小明正在思考一个问题:
如果每个字母的个数有限定,能组成多少个已知长度的串呢?

他请好朋友来帮忙,很快得到了代码,
解决方案超级简单,然而最重要的部分却语焉不详。

请仔细分析源码,填写划线部分缺少的内容。

#include <stdio.h>

// a个A,b个B,c个C 字母,能组成多少个不同的长度为n的串。
int f(int a, int b, int c, int n)
{
    if(a<0 || b<0 || c<0) return 0;
    if(n==0) return 1; 
    
    //return ______________________________________ ;  // 填空
    return f(a-1,b,c,n-1)+f(a,b-1,c,n-1)+f(a,b,c-1,n-1);
}

int main()
{
    printf("%d\n", f(1,1,1,2));
    printf("%d\n", f(1,2,3,3));
    return 0;
}

对于上面的测试数据,小明口算的结果应该是:
6
19


6.标题:最大公共子串

最大公共子串长度问题就是:
求两个串的所有子串中能够匹配上的最大长度是多少。

比如:"abcdkkk" 和 "baabcdadabc",
可以找到的最长的公共子串是"abcd",所以最大公共子串长度为4。

下面的程序是采用矩阵法进行求解的,这对串的规模不大的情况还是比较有效的解法。

请分析该解法的思路,并补全划线部分缺失的代码。

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

#define N 256
int f(const char* s1, const char* s2)
{
    int a[N][N];
    int len1 = strlen(s1);
    int len2 = strlen(s2);
    int i,j;
    
    memset(a,0,sizeof(int)*N*N);
    int max = 0;
    for(i=1; i<=len1; i++){
        for(j=1; j<=len2; j++){
            if(s1[i-1]==s2[j-1]) {
                //a[i][j] = __________________________;  //填空
                a[i][j] = i;
                if(a[i][j] > max) max = a[i][j];
            }
        }
    }
    
    return max;
}

int main()
{
    printf("%d\n", f("abcdkkk", "baabcdadabc"));
    return 0;
}


7.描述:正则问题

考虑一种简单的正则表达式:
只由 x ( ) | 组成的正则表达式。
小明想求出这

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值