2017第八屆藍橋杯C/C++語言A組


一:題目:

標題:迷宮

X星球的一處迷宮游樂場建在某個小山坡上。
它是由10x10相互連通的小房間組成的。

房間的地板上寫着一個很大的字母。
我們假設玩家是面朝上坡的方向站立,則:
L表示走到左邊的房間,
R表示走到右邊的房間,
U表示走到上坡方向的房間,
D表示走到下坡方向的房間。

X星球的居民有點懶,不願意費力思考。
他們更喜歡玩運氣類的游戲。這個游戲也是如此!

開始的時候,直升機把100名玩家放入一個個小房間內。
玩家一定要按照地上的字母移動。

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

請你計算一下,最后,有多少玩家會走出迷宮?
而不是在里邊兜圈子。

請提交該整數,表示走出迷宮的玩家數目,不要填寫任何多余的內容。

參考:

藍橋杯果然越來越不水了(本人菜鳥。。。。。)這是遞歸寫的,low,坐等bigold。

#include <iostream>  
#include <cmath>  
#include <stdio.h>
#include <cstdio>  
#include <cstring>  
#include<algorithm>  
#include<time.h>
#include<math.h>
#include <stdlib.h>
#include <string.h>
#include <stack>  

using namespace std;

int canornot[10][10];
char map[10][10];
int flag = 0;

int canout(int x, int y)
{
    int prex = x, prey = y;
    flag++;
    if (x < 0 || x>9 || y < 0 || y>9||canornot[y][x]==1)
    {
        flag--;
        return 1;
    }
    switch (map[y][x])
    {
    case 'U':
        y ++;
        break;
    case'D':
        y --;
        break;
    case'R':
        x ++;
        break;
    case'L':
        x --;
        break;
    }
    if (flag > 102)
    {
        canornot[y][x] = 0;
        flag--;
        return 0;
    }
    if (canout(x, y))
    {
        canornot[prey][prex] = 1;
        flag--;
        return 1;
    }
    else
    {
        canornot[prey][prex] = 0;
        flag--;
        return 0;
    }
}

int main()
{
    int x, y;
    int sum=0;
    char useless;
    for (y = 9; y >= 0; y--)
    {
        for (x = 0; x < 10; x++)
        {
            scanf("%c", &map[y][x]);
            canornot[y][x] = -1;
        }
        scanf("%c",&useless);
    }
    
    for (y = 9; y >= 0; y--)
    {
        for (x = 0; x < 10; x++)
        {
            canout(x, y);
            if (canornot[y][x])
                sum++;
        }
    }
    printf("\n%d\n", sum);
    return 0;
}

二:題目:

標題:跳蚱蜢

如圖 p1.png 所示:
有9只盤子,排成1個圓圈。
其中8只盤子內裝着8只蚱蜢,有一個是空盤。
我們把這些蚱蜢順時針編號為 1~8

每只蚱蜢都可以跳到相鄰的空盤中,
也可以再用點力,越過一個相鄰的蚱蜢跳到空盤中。

請你計算一下,如果要使得蚱蜢們的隊形改為按照逆時針排列,
並且保持空盤的位置不變(也就是1-8換位,2-7換位,...),至少要經過多少次跳躍?

注意:要求提交的是一個整數,請不要填寫任何多余內容或說明文字。

參考:

三:魔方模擬,,,,跳過(一般是看不懂的節奏)

四:題目:

 

標題:方格分割

6x6的方格,沿着格子的邊線剪開成兩部分。
要求這兩部分的形狀完全相同。

如圖:p1.png, p2.png, p3.png 就是可行的分割法。

試計算:
包括這3種分法在內,一共有多少種不同的分割方法。
注意:旋轉對稱的屬於同一種分割法。

參考:

結果因為旋轉要除四;此解沒有剪枝,

#include <iostream>  
#include <cmath>  
#include <stdio.h>
#include <cstdio>  
#include <cstring>  
#include<algorithm>  
#include<time.h>
#include<math.h>
#include <stdlib.h>
#include <string.h>
#include <stack> 
#include <queue>

using namespace std;


int map[8][8];
int dire[4][2] = { -1,0,1,0,0,-1,0,1 };//方向
const int N = 6;
int ans;
void dfs(int x, int y)
{
    if (x == 0 || y == N || x == N || y == 0) {
        ans++; return;
    }
    for (int i = 0; i<4; i++)
    {
        int nx = x + dire[i][0];
        int ny = y + dire[i][1];
        if (nx<0 || nx>N || y<0 || ny>N)continue;
        if (!map[nx][ny])
        {
            map[nx][ny] = 1;
            map[N - nx][N - ny] = 1;
            dfs(nx, ny);

            map[nx][ny] = 0;
            map[N - nx][N - ny] = 0;
        }

    }
}
int main()
{
    map[N / 2][N / 2] = 1;
    dfs(N / 2, N / 2);
    cout << ans / 4 << endl;
    return 0;
}

五:題目

 

標題:字母組串

由 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 ______________________________________ ;  // 填空
}

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

對於上面的測試數據,小明口算的結果應該是:
6
19er


注意:只填寫划線部分缺少的代碼,不要提交任何多余內容或說明性文字。

 

 

 

參考: 剛開始想復雜了,結果,,,,  f(a-1,b,c,n-1)+f(a,b-1,c,n-1)+f(a,b,c-1,n-1)

六:題目:

標題:最大公共子串

最大公共子串長度問題就是:
求兩個串的所有子串中能夠匹配上的最大長度是多少。

比如:"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] = __________________________; //填空
if(a[i][j] > max) max = a[i][j];
}
}
}

return max;
}

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

 

參考:emmmm,,,第一眼還以為kmp

a[i-1][j-1]+1

 七:題目:


描述:正則問題

考慮一種簡單的正則表達式:
只由 x ( ) | 組成的正則表達式。
小明想求出這個正則表達式能接受的最長字符串的長度。

例如 ((xx|xxx)x|(x|xx))xx 能接受的最長字符串是: xxxxxx,長度是6。

輸入
----
一個由x()|組成的正則表達式。輸入長度不超過100,保證合法。

輸出
----
這個正則表達式能接受的最長字符串的長度。

例如,
輸入:
((xx|xxx)x|(x|xx))xx

程序應該輸出:
6

資源約定:
峰值內存消耗(含虛擬機) < 256M
CPU消耗 < 1000ms


請嚴格按要求輸出,不要畫蛇添足地打印類似:“請您輸入...” 的多余內容。

注意:
main函數需要返回0;
只使用ANSI C/ANSI C++ 標准;
不要調用依賴於編譯環境或操作系統的特殊函數。
所有依賴的函數必須明確地在源文件中 #include <xxx>
不能通過工程設置而省略常用頭文件。

參考:實話說,完全看不懂題目在說啥,后來發現原來這是最簡單的題目。

#include <iostream> 
#include <cmath>  
#include <stdio.h>
#include <cstdio>  
#include <cstring>  
#include<algorithm>  
#include<time.h>
#include<math.h>
#include <stdlib.h>
#include <string>
#include <stack> 
#include <queue>

using namespace std;


string str;
int pos, len;
int dfs()
{
    int xnum = 0, res = 0;
    while (pos < len) {
        if (str[pos] == '(') {
            pos++;
            xnum += dfs();
        }
        else if (str[pos] == ')') {
            pos++;
            break;
        }
        else if (str[pos] == '|') {
            pos++;
            res = max(xnum, res);
            xnum = 0;
        }
        else {
            pos++;
            xnum++;
        }
    }
    res = max(xnum, res);
    return res;
}
int main()
{
    cin >> str;
    int ans = 0;
    len = str.length(), pos = 0;
    ans = dfs();
    cout << ans << endl;
    return 0;
}

 

八:題目:

標題:包子湊數

小明幾乎每天早晨都會在一家包子鋪吃早餐。他發現這家包子鋪有N種蒸籠,其中第i種蒸籠恰好能放Ai個包子。每種蒸籠都有非常多籠,可以認為是無限籠。

每當有顧客想買X個包子,賣包子的大叔就會迅速選出若干籠包子來,使得這若干籠中恰好一共有X個包子。比如一共有3種蒸籠,分別能放3、4和5個包子。

當顧客想買11個包子時,大叔就會選2籠3個的再加1籠5個的(也可能選出1籠3個的再加2籠4個的)。

當然有時包子大叔無論如何也湊不出顧客想買的數量。比如一共有3種蒸籠,分別能放4、5和6個包子。而顧客想買7個包子時,大叔就湊不出來了。

小明想知道一共有多少種數目是包子大叔湊不出來的。

輸入
----
第一行包含一個整數N。(1 <= N <= 100)
以下N行每行包含一個整數Ai。(1 <= Ai <= 100)

輸出
----
一個整數代表答案。如果湊不出的數目有無限多個,輸出INF。

例如,
輸入:
2
4
5

程序應該輸出:
6

再例如,
輸入:
2
4
6

程序應該輸出:
INF

樣例解釋:
對於樣例1,湊不出的數目包括:1, 2, 3, 6, 7, 11。
對於樣例2,所有奇數都湊不出來,所以有無限多個。

資源約定:
峰值內存消耗(含虛擬機) < 256M
CPU消耗 < 1000ms

參考:

 

對於整系數方程 ax+by = c ,
如果 a、b 的最大公約數能整除 c ,那么它的整數解有無數多個,
如果 a、b 的最大公約數不能整除 c,那么它沒有整數解。
如果a、b的最大公約數不為1,則不論x、y是啥,數不到的就會有無窮個;
為一的話,就是有限個。
#include <iostream>  
#include <cmath>  
#include <stdio.h>
#include <cstdio>  
#include <cstring>  
#include<algorithm>  
#include<time.h>
#include<math.h>
#include <stdlib.h>
#include <string.h>
#include <stack> 
#include <queue>

using namespace std;

int gcd(int a, int b) 
{
    if (b == 0) 
        return a;
    return gcd(b, a%b);
}

int unit[110], n;
const int N = 10010;
bool sign[N];

int main()
{

        scanf("%d", &n);
        for (int i = 0; i < n; i++)
            scanf("%d", &unit[i]);
        int g = unit[0];
        for (int i = 1; i < n; i++)
            g = gcd(g, unit[i]);
        if (g != 1)
        {
            printf("INF\n");
        }
        else
        {
            sign[0] = true;
            for (int i = 0; i < n; i++)
            {
                for (int j = 0; j + unit[i] < N; j++)
                    if (sign[j])
                        sign[j + unit[i]] = true;
            }
            int count = 0;
            for (int i = 0; i < N - 1; i++)
            {
                if (sign[i] == false)
                    count++;
            }
            printf("%d\n", count);
        }
        return 0;

}

 九:題目:

標題: 分巧克力

兒童節那天有K位小朋友到小明家做客。小明拿出了珍藏的巧克力招待小朋友們。
小明一共有N塊巧克力,其中第i塊是Hi x Wi的方格組成的長方形。

為了公平起見,小明需要從這 N 塊巧克力中切出K塊巧克力分給小朋友們。切出的巧克力需要滿足:

1. 形狀是正方形,邊長是整數
2. 大小相同

例如一塊6x5的巧克力可以切出6塊2x2的巧克力或者2塊3x3的巧克力。

當然小朋友們都希望得到的巧克力盡可能大,你能幫小Hi計算出最大的邊長是多少么?

輸入
第一行包含兩個整數N和K。(1 <= N, K <= 100000)
以下N行每行包含兩個整數Hi和Wi。(1 <= Hi, Wi <= 100000)
輸入保證每位小朋友至少能獲得一塊1x1的巧克力。

輸出
輸出切出的正方形巧克力最大可能的邊長。

樣例輸入:
2 10
6 5
5 6

樣例輸出:
2

資源約定:
峰值內存消耗(含虛擬機) < 256M
CPU消耗 < 1000ms


請嚴格按要求輸出,不要畫蛇添足地打印類似:“請您輸入...” 的多余內容。

注意:
main函數需要返回0;
只使用ANSI C/ANSI C++ 標准;
不要調用依賴於編譯環境或操作系統的特殊函數。
所有依賴的函數必須明確地在源文件中 #include <xxx>
不能通過工程設置而省略常用頭文件。

提交程序時,注意選擇所期望的語言類型和編譯器類型。

參考:呃呃呃,二分搜索找最大邊長

 

#include <iostream>  
#include <cmath>  
#include <stdio.h>
#include <cstdio>  
#include <cstring>  
#include<algorithm>  
#include<time.h>
#include<math.h>
#include <stdlib.h>
#include <string.h>
#include <stack> 
#include <queue>

using namespace std;

int n, k, length[100010], wide[100010];

bool chocolate(int n)
{
    int num = 0, a, b, i;
    for (i = 0; i<n; i++)
    {
        a = length[i] / n;
        b = wide[i] / n;
        num += a*b;
    }
    if (num >= k)
        return true;
    return false;
}
int main()
{
    int i, low, high;
    while (scanf("%d%d", &n, &k) != EOF)
    {
        low = 1;
        high = 10000;
        for (i = 0; i<n; i++)
            scanf("%d%d", &length[i], &wide[i]);
        while (low<high - 1)
        {
            int mid = (low + high) / 2;
            if (!chocolate(mid))
                high = mid;
            else
                low = mid;
        }
        printf("%d\n", low);
    }
    return 0;
}

 十:題目:

標題:油漆面積

X星球的一批考古機器人正在一片廢墟上考古。
該區域的地面堅硬如石、平整如鏡。
管理人員為方便,建立了標准的直角坐標系。

每個機器人都各有特長、身懷絕技。它們感興趣的內容也不相同。
經過各種測量,每個機器人都會報告一個或多個矩形區域,作為優先考古的區域。

矩形的表示格式為(x1,y1,x2,y2),代表矩形的兩個對角點坐標。

為了醒目,總部要求對所有機器人選中的矩形區域塗黃色油漆。
小明並不需要當油漆工,只是他需要計算一下,一共要耗費多少油漆。

其實這也不難,只要算出所有矩形覆蓋的區域一共有多大面積就可以了。
注意,各個矩形間可能重疊。

本題的輸入為若干矩形,要求輸出其覆蓋的總面積。

輸入格式:
第一行,一個整數n,表示有多少個矩形(1<=n<10000)
接下來的n行,每行有4個整數x1 y1 x2 y2,空格分開,表示矩形的兩個對角頂點坐標。
(0<= x1,y1,x2,y2 <=10000)

輸出格式:
一行一個整數,表示矩形覆蓋的總面積。

例如,
輸入:
3
1 5 10 10
3 1 20 20
2 7 15 17

程序應該輸出:
340

再例如,
輸入:
3
5 2 10 6
2 7 12 10
8 1 15 15

程序應該輸出:
128

資源約定:
峰值內存消耗(含虛擬機) < 256M
CPU消耗 < 2000ms


請嚴格按要求輸出,不要畫蛇添足地打印類似:“請您輸入...” 的多余內容。

注意:
main函數需要返回0;
只使用ANSI C/ANSI C++ 標准;
不要調用依賴於編譯環境或操作系統的特殊函數。
所有依賴的函數必須明確地在源文件中 #include <xxx>
不能通過工程設置而省略常用頭文件。

提交程序時,注意選擇所期望的語言類型和編譯器類型。

參考:這個不會  可以看矩形面積並   線段樹   hdu1542


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM