POJ 3050——Hopscotch

問題描述

母牛以非傳統方式玩孩子的跳房子游戲。母牛沒有跳入的一組線性數字框,而是創建了一個與x和y軸平行的5x5直線數字網格。

然後,他們熟練地跳到網格中的任何數字,然後向前,向後,向右或向左 跳到網格中的另一個數字。他們再次跳(相同的規則)到一個數字(可能是一個已經訪問過的數字)。

共有5個網格內躍點,它們的躍點會創建一個六位整數(可能具有前導零,如000201)。

確定可以通過這種方式創建的不同整數的數量的計數。

樣例輸入(5*5)

1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 2 1
1 1 1 1 1

樣例輸出
15(可以構造111111、111112、111121、111211、111212、112111、112121、121111、121112、121211、121212、211111、211121、212111和212121。沒有其他值是可能的。)

問題解釋

題目問題規模小,直接暴力加深度優先搜索。因爲題目沒有說從哪裏開始跳,所以每個格子都得試一試(暴力)。接着就是可以上下左右跳動(即dfs)。總共跳六次。

代碼使用了set集合,這是因爲需要避免搜索過程中出現重複的現象,然後輸入set大小。(今天剛學,現學現用 嘻嘻~)

#include<iostream>
#include<set>

using namespace std;

int map[5][5] = 
{
	{1,1,1,1,1},
	{1,1,1,1,1},
	{1,1,1,1,1},
	{1,1,1,2,1},
	{1,1,1,1,1}
};
int dx[4] = { 1, -1, 0, 0 };
int dy[4] = { 0, 0, 1, -1 };

set<int> s;

//************************************
// Method:    暴力+dfs
// FullName:  窮竭搜索+深度優先搜索
// Access:    public 
// Returns:   void
// Idea: 六步迷宮問題
//************************************

void dfs(int x, int y, int (*map)[5], int value, int step)
{
	if (step == 5)
	{
		s.insert(value);
		return;
	}
	for (int i = 0; i < 4; i++)
	{
		int nx = x + dx[i];
		int ny = y + dy[i];
		if (0 <= nx && nx < 5 && 0 <= ny && ny < 5)
		{
			step++;
			dfs(nx, ny, map, value * 10 + map[nx][ny], step);
			step--;
		}
	}
}
void solve()
{
	for (int i = 0; i < 5; ++i)
	{
		for (int j = 0; j < 5; ++j)
		{
			dfs(i, j, map, map[i][j], 0);
		}
	}
	cout << s.size() << endl;
}
///////////////////////SubMain//////////////////////
int main()
{
	
	solve();
	return 0;
}
///////////////////////SubEnd//////////////////////
發佈了17 篇原創文章 · 獲贊 20 · 訪問量 5408
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章