题目:POJ 3050
思路:
看了@Lorazepam的代码
原本的思路是用 vector<int> 存放生成的整数,这样还需要在放进去之前把位数乘基数变成相应整数,而且需要对 vector 去重
然后才发现有 set 这一好用容器,插入值重复的话会插入失败,因此最后只要用 .size() 就可以得到所有的可能性了。并且不用bother to生成整数,直接当成字符串放进去就好了。
用DFS,网格上的每一点都依次作为起点开始深搜,每跳一步 n 就加 1,当 n 为 6 时,说明前面已经有 0~5 这 6 步了, 返回。
因为有 n 为 6 做限制,所以就算可以重复访问,也不会无限循环。
还需进一步领会深搜和广搜的精神。
1 #include <iostream> 2 #include <set> 3 #include <string> 4 5 using namespace std; 6 7 int grid[5][5]; 8 int dx[4] = {-1, 0, 1, 0}; 9 int dy[4] = {0, -1, 0, 1}; 10 char digits[6]; 11 set<string> integers; 12 13 void dfs(int x, int y, int n) { 14 if (n == 6) { 15 string temp = digits; 16 integers.insert(temp); 17 return; 18 } 19 digits[n] = grid[x][y] + '0'; 20 for (int i = 0; i < 4; i++) { 21 int nx = x + dx[i]; 22 int ny = y + dy[i]; 23 if (nx >= 0 && nx < 5 && ny >= 0 && ny < 5) { 24 dfs(nx, ny, n + 1); 25 } 26 } 27 } 28 29 int main() { 30 for (int i = 0; i < 5; i++) { 31 for (int j = 0; j < 5; j++) { 32 cin >> grid[i][j]; 33 } 34 } 35 36 for (int i = 0; i < 5; i++) { 37 for (int j = 0; j < 5; j++) { 38 dfs(i, j, 0); 39 } 40 } 41 cout << integers.size(); 42 return 0; 43 }