题目: http://poj.org/problem?id=3050
有一个5*5的网格,网格上每个格点有一个数字,从网格任一点出发,可以移动5步,每步可以选择上下左右四个方向,根据沿途格子上的数字可以组成一个6位数,需要得出在这个网格上能够组成多少个不同的6位数。
样例输入:
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 2 1
1 1 1 1 1
样例输出:
15
思路:
- 因为网格是固定的5X5,可以考虑将所有情况都枚举出来,这样复杂度为4^5*25 = 25600。然后将每次走完5步后得到的数放入set中,直接根据set的大小就可知道一共可以组成多少不同的数。
代码:
#include <iostream>
#include <set>
using namespace std;
int grid[5][5];
set<int> digits;
int dr[] = {-1, 0, 0, 1};
int dc[] = {0, 1, -1, 0};
void dfs(int i, int j, int step, int num){
if(step == 5){
digits.insert(num);
return;
}
for(int idx = 0; idx < 4; ++idx){
int nx = i + dr[idx];
int ny = j + dc[idx];
if(nx >= 0 && nx < 5 && ny >= 0 && ny < 5){
dfs(nx, ny, step+1, num*10+grid[nx][ny]);
}
}
}
int main(){
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
for(int i = 0; i < 5; ++i)
for(int j = 0; j < 5; ++j){
scanf("%d", &grid[i][j]);
}
for(int i = 0; i < 5; ++i)
for(int j = 0; j < 5; ++j){
int step = 0, num = grid[i][j];
dfs(i, j, step, num);
}
printf("%d
", digits.size());
}