問題描述
母牛以非傳統方式玩孩子的跳房子游戲。母牛沒有跳入的一組線性數字框,而是創建了一個與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//////////////////////