• poj3050 hopscotch


    题目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());
    }
    
  • 相关阅读:
    蜘蛛禁止访问文件
    基于PhalApi的Smarty拓展 (视图层的应用)
    MySQL数据库存表情
    查看PHP版本等相关信息
    读取数据库表信息
    nginx简介
    Redis发布订阅
    Redis持久化
    Redis主从复制
    Redis的Java客户端Jedis
  • 原文地址:https://www.cnblogs.com/patrolli/p/12207778.html
Copyright © 2020-2023  润新知