题目http://poj.org/problem?id=3050

有一个5*5的网格,网格上每个格点有一个数字,从网格任一点出发,可以移动5步,每步可以选择上下左右四个方向,根据沿途格子上的数字可以组成一个6位数,需要得出在这个网格上能够组成多少个不同的6位数。

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

样例输入

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\n", digits.size());
}
扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄