poj 3050 地圖5位數問題 dfs算法
阿新 • • 發佈:2018-08-02
names 解決 style div 代碼 ret 地圖 數字 \n
題意:一個5*5地圖上面,從任意位置上下左右跳五次,組成一個數。問:不重復的數有多少個?
思路:dfs
- 從任意位置跳5次,說明每個位置都需要遍歷。
- 組成一個數:number*10+map[dx][dy]
- 不重復的數字,用set(集合)來存儲
- 只需要每次跳的時候步數加1,並且可以跳的位置,只要不超過範圍就可以,即一個位置可以重復跳
解決問題的代碼:
#include <iostream> #include <cstdio> #include <set> using namespace std; int map[5][5]; set<int> results;const int dir[4][2] { { 0,1 },{ 0,-1 },{ 1,0 },{ -1,0 } }; void dfs(const int& x, const int& y, const int& step, const int& number) { if (step == 5) { results.insert(number); return; } for (int i = 0; i < 4; i++) { int dx = x + dir[i][0];int dy = y + dir[i][1]; if (dx >= 0 && dx < 5 && dy >= 0 && dy < 5) dfs(dx, dy, step + 1, number * 10 + map[dx][dy]); } } int main() { for (int i = 0; i < 5; i++) for (int j = 0; j < 5; j++) scanf("%d", &map[i][j]);for (int i = 0; i < 5; i++) for (int j = 0; j < 5; j++) dfs(i, j, 0, map[i][j]); printf("%d\n", results.size()); return 0; }
poj 3050 地圖5位數問題 dfs算法