题目:
http://poj.org/problem?id=3050
题意:
牛在玩一种跳格子游戏,规则如下:
给定 5*5 的格子,每个格子上有对应数字
牛每次可任意选定一个起始位置,向上下左右任一一个方向,跳一个格子,共跳5次,跳过的格子仍然可以继续跳
将每次所跳格子上的数字连起来,组成数字串,求一共有多少种数字串
思路:
这题类似于迷宫类的DFS题,不过一个小区别就是,这题不用visit数组来记录是否访问,因为跳过的格子,仍然可以继续跳
用<set>来去重
这题的比较关键之处在于,能不能想到要用DFS来解决该题
代码:
#include <iostream>
#include <set>
using namespace std;
int d[4][2] = {{-1, 0}, {1, 0}, {0, 1}, {0, -1}};
int maze[5][5];
set<int> ans;
void DFS(int x, int y, int step, int num)
{
if (step == 5)
{
ans.insert(num);
return;
}
for (int i = 0; i < 4; i++)
{
int newx = x + d[i][0], newy = y + d[i][1];
if (newx >= 0 && newx < 5 && newy >= 0 && newy < 5)
{
DFS(newx, newy, step + 1, num * 10 + maze[newx][newy]);
}
}
}
int main()
{
for (int i = 0; i < 5; i++)
for (int j = 0; j < 5; j++)
cin >> maze[i][j];
for (int i = 0; i < 5; i++)
for (int j = 0; j < 5; j++)
DFS(i, j, 0, maze[i][j]);
cout << (int)ans.size() << endl;
return 0;
}