振興中華 - 藍橋杯

歡迎訪問我的新博客: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

(全文完)

發佈了98 篇原創文章 · 獲贊 12 · 訪問量 22萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章