1. 程式人生 > >poj 3050 地圖5位數問題 dfs算法

poj 3050 地圖5位數問題 dfs算法

names 解決 style div 代碼 ret 地圖 數字 \n

題意:一個5*5地圖上面,從任意位置上下左右跳五次,組成一個數。問:不重復的數有多少個?

思路:dfs

  1. 從任意位置跳5次,說明每個位置都需要遍歷。
  2. 組成一個數:number*10+map[dx][dy]
  3. 不重復的數字,用set(集合)來存儲
  4. 只需要每次跳的時候步數加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算法