zoukankan      html  css  js  c++  java
  • 【剑指offer66 机器人的运动范围】

    题目描述

    地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?
     
    注意:机器人必须一格一格走,不能跨越不能到达的区域
     
    class Solution {
        int get(int x) {
            //返回各位数值之和
            int res=0;
            for (; x; x /= 10){
                res += x % 10;
            }
            return res;
        }
        
    public:  
        int movingCount(int k, int m, int n)
        {
            if(k<=0)return 0;
            if (!k) return 1; //k=0的情况
            int vis[m][n] ; //记录是否可访问到
            memset(vis,0,sizeof(vis));
            int ans = 1;
            vis[0][0] = 1;
            for (int i = 0; i < m; ++i) {
                for (int j = 0; j < n; ++j) {
                    //判断起点  以及  条件
                    if ((i == 0 && j == 0) || get(i) + get(j) > k) continue;
                    //满足条件后   边界判断   判断机器人是否能够移动到此点
                    //只可能是从左边 或者上面过来的  所以只判断这两个方向可不可达就行
                    //if (i - 1 >= 0) vis[i][j] |= vis[i - 1][j]; //或 等于  做或运算
                    //if (j - 1 >= 0) vis[i][j] |= vis[i][j - 1];
                    
                    if (i - 1 >= 0 && vis[i-1][j])vis[i][j]=1; 
                    if (j - 1 >= 0 && vis[i][j-1])vis[i][j]=1;
                    ans += vis[i][j]; //如果不可达 自然为0
                }
            }
            return ans;
        }
    };
  • 相关阅读:
    VS2010安装笔记
    Blend4中文版中截取图片的方法
    改变窗口的位置 (转载)
    窗口的位置
    windows消息大全
    WM_MOUSELEAVE和WM_MOUSEHOVER使用
    setwindowpos
    无注册表的COM调用
    WM_CLOSE WM_QUIT WM_DESTROY 三者的区别
    WM_MOUSEWHEEL消息
  • 原文地址:https://www.cnblogs.com/Stephen-Jixing/p/13137816.html
Copyright © 2011-2022 走看看