zoukankan      html  css  js  c++  java
  • 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());
    }
    
  • 相关阅读:
    Gulp使用入门操作---压缩JS
    Linux如何查看进程及如何杀死进程
    连不上GitHub,也ping不通,亲测解决方案
    idea一键生成mybatis工具
    idea逆向生成hibernate工程
    idea常用快捷键大全
    mysql日期函数
    数据库事务
    idea激活码
    oracle创建表前校验是否存在
  • 原文地址:https://www.cnblogs.com/patrolli/p/12207778.html
Copyright © 2011-2022 走看看