POJ 3050: Hopscotch
http://poj.org/problem?id=3050
题目大致意思:
1.5*5的方阵中,先随意挑一格,记住这个格子的数字
2.可以上下左右走,走5次,每走一次记录下所走格子的数字
3.经过以上步奏,把总共6个数字连起来,形成一串数字。求总共可以形成多少种不同的数字串
思路:
网格大小只有5*5,用穷举法,不会超时。我用的是深度搜索
这里利用了stl中的set容器来防止重复。最终只要输出set的size就是结果(不用set自己来处理重复的话太累人)
set元素类型使用string,这样比较方便(stl元素类型要求能赋值和拷贝,不管整形数组还是字符型数组都不行)
1 #include <stdio.h> 2 #include <set> 3 #include <string> 4 using namespace std; 5 6 int grid[5][5]; //输入的网格 7 set<string> s; //存结果,用set防止重复 8 string tempString; //存临时变量,当前的字符串 9 10 int go[][2] = 11 { 12 0, 1, 13 0, -1, 14 1, 0, 15 -1, 0 16 }; //四个方向 17 18 //深度搜索 19 void dfs(int row, int col, int depth) 20 { 21 if (depth == 5) //满6个,存到set里 22 { 23 s.insert(tempString); 24 return; 25 } 26 27 for (int i = 0; i < 4; i++) //4个方向深度搜索 28 { 29 int tr = row + go[i][0]; 30 int tc = col + go[i][1]; 31 32 //越界判断 33 if (tr < 0 || tr >= 5 || tc < 0 || tc >= 5) 34 continue; 35 36 tempString.push_back(grid[tr][tc] + '0'); 37 dfs(tr, tc, depth + 1); 38 tempString.resize(tempString.size() - 1); //pop_back通不过c++的编译 39 } 40 } 41 42 int main() 43 { 44 //输入 45 for (int i = 0; i < 5; i++) 46 for (int j = 0; j < 5; j++) 47 scanf("%d", &grid[i][j]); 48 49 //处理 50 for (int i = 0; i < 5; i++) 51 { 52 for (int j = 0; j < 5; j++) 53 { 54 tempString = grid[i][j] + '0'; //开始记录 55 dfs(i, j, 0); 56 } 57 } 58 59 printf("%d\n", s.size()); //输出set中的元素个数就可以了 60 61 return 0; 62 }