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;
        }
    };
  • 相关阅读:
    SQL分页语句
    读、写 节点 XML方法总结
    新手入门:XHTML DHTML SHTML的区别
    ROS映射非21端口的FTP服务器设置
    图解:asp.net三种重定向方法
    在ASP.NET中显示进度条
    C#读取文本文件
    Net3.5都快来了,.Net2.0你们都知道多少呢?
    div+css布局漫谈
    自定义的向客户端输出Javascript脚本alert函数
  • 原文地址:https://www.cnblogs.com/Stephen-Jixing/p/13137816.html
Copyright © 2011-2022 走看看