一:題目:
標題:迷宮
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