码迷,mamicode.com
首页 > 其他好文 > 详细

poj3050 hopscotch

时间:2020-01-18 01:18:05      阅读:75      评论:0      收藏:0      [点我收藏+]

标签:href   题目   ref   dfs   NPU   不同   grid   pre   space   

题目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\n", digits.size());
}

poj3050 hopscotch

标签:href   题目   ref   dfs   NPU   不同   grid   pre   space   

原文地址:https://www.cnblogs.com/patrolli/p/12207778.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!