歡迎訪問我的新博客:http://www.milkcu.com/blog/
原文地址:http://www.milkcu.com/blog/archives/1395367620.html
引言
這是2013年藍橋杯軟件大賽預賽A組(C/C++組)第3題,是個填空題,和深度優先搜索(DFS)有關,數路線和代碼實現均較容易。
題目描述
標題: 振興中華
小明參加了學校的趣味運動會,其中的一個項目是:跳格子。
地上畫着一些格子,每個格子裏寫一個字,如下所示:(也可參見p1.jpg)
從我做起振
我做起振興
做起振興中
起振興中華
比賽時,先站在左上角的寫着“從”字的格子裏,可以橫向或縱向跳到相鄰的格子裏,但不能跳到對角的格子或其它位置。一直要跳到“華”字結束。
要求跳過的路線剛好構成“從我做起振興中華”這句話。
請你幫助小明算一算他一共有多少種可能的跳躍路線呢?
答案是一個整數,請通過瀏覽器直接提交該數字。
注意:不要提交解答過程,或其它輔助說明類的內容。
分析
由於數據規模比較小,可以不用編程實現,直接一條一條路線的數數。
比較好的方法是從上往下、從右往左的數,這樣前面數過的路線剛好可以應用到後面的數數中。
1 = 1
1 + 2 = 3
3 + 3 = 6
6 + 4 = 10
10 + 5 = 15
所有路線加起來即可得到答案。
當然這題也可以使用深度優先實現,代碼也很簡單。
把“從我做起振興中華”8個字替換爲0~7的8個數字。
使用深度優先算法可以很方便的得出結果。
代碼實現
#include <iostream>
#include <cmath>
#include <cstring>
using namespace std;
int map[4][5] = {{0, 1, 2, 3, 4},
{1, 2, 3, 4, 5},
{2, 3, 4, 5, 6},
{3, 4, 5, 6, 7}};
int cnt = 0;
int vis[4][5];
void dfs(int a, int b) {
//cout << "dfs " << a << " " << b << endl;
if(vis[a][b]) {
return;
}
if(a == 3 && b == 4) {
cnt++;
return;
}
vis[a][b] = 1;
for(int i = -1; i <= 1; i++) {
for(int j = -1; j <= 1; j++) {
if(i == j || abs(i) == abs(j)) {
continue;
}
int newa = a + i;
int newb = b + j;
if(newa < 0 || newa >= 4 || newb < 0 || newb >= 5) {
continue;
}
if(map[newa][newb] - map[a][b] == 1) {
dfs(newa, newb);
}
}
}
vis[a][b] = 0;
}
int main(void) {
memset(vis, 0, sizeof(vis));
dfs(0, 0);
cout << cnt << endl;
return 0;
}
答案
35
(全文完)