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 }

 

posted @ 2015-04-22 15:32  iswoit  阅读(647)  评论(0编辑  收藏  举报