今天完成了剑指offer上的66道编程题,感觉自己还是很多代码实现能力和算法积累都还不够!还需要继续联系,坚持自己独立写代码实现。

最后将今天的两道题目奉上,都有异曲同工之妙:

矩阵中的路径:

#include<memory.h>

//题目描述
//
//请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。
//路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。
//如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。
//例如 a b c e s f c s a d e e 矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,
//因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入该格子。 //思路
//深搜的基本题型,分别以每个格子为起点,往四个方向去遍历,直到找到符合题意的字符串即可
class Solution {
public:
bool hasPath(char* matrix, int rows, int cols, char* str)
{
if (matrix==nullptr||str==nullptr||rows<||cols<)
{
return false;
}
//建立一个标记数组,走过的位置为true,没走过的为false
bool *vis = new bool[rows*cols];
memset(vis,false,rows*cols);
int pathLength = ;
for (size_t i = ; i < rows; i++)
{
for (size_t j = ; j < cols; j++)
{
if (hasPathCore(matrix,rows,cols,i,j,str,pathLength,vis))
{
return true;
}
}
}
delete[]vis;
return false;
}
//判断从一个元素出发是否能找到一条路径
bool hasPathCore(char *matrix,int rows,int cols,int x,int y,char *str,int pathLength,bool *vis)
{
if (str[pathLength]=='\0')//嵌套调用出口
{
return true;
}
bool hasPath = false;//函数返回值
if (x>=&&x<=rows&&y>=&&y<=cols&&matrix[x*cols+y]==str[pathLength]&&!vis[x*cols+y])//坐标范围判断,x=0开始,所以x*cols+y索引正确
{
++pathLength;
vis[x*cols + y] = true;
hasPath = hasPathCore(matrix, rows, cols, x - , y, str, pathLength, vis)
|| hasPathCore(matrix, rows, cols, x + , y, str, pathLength, vis)
|| hasPathCore(matrix, rows, cols, x, y - , str, pathLength, vis)
|| hasPathCore(matrix, rows, cols, x, y + , str, pathLength, vis);
if (!hasPath) //没有路径时,返回到原来位置
{
--pathLength;
vis[x*cols + y] = false;
}
}
return hasPath;
}
};
//题目描述:机器人的运动范围
//
//地上有一个m行和n列的方格。一个机器人从坐标0, 0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,
//但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35, 37),因为3 + 5 + 3 + 7 = 18。
//但是,它不能进入方格(35, 38),因为3 + 5 + 3 + 8 = 19。请问该机器人能够达到多少个格子? //思路
//深搜基础题,从0开始按照四个方向递归求解即可
class Solution {
public:
int movingCount(int threshold, int rows, int cols)
{
bool *vis = new bool[rows*cols];
memset(vis,false,rows*cols);
int result = movingCountCore(threshold,rows,cols,,,vis);
delete[]vis;
return result;
}
int movingCountCore(int threshold,int rows,int cols,int x,int y,bool *vis)
{
int count = ;
if (x >= && x<rows && y >= && y<cols && getSum(x) + getSum(y) <= threshold && !vis[x*cols + y])
{
vis[x*cols + y] = true;
count = + movingCountCore(threshold, rows, cols, x - , y, vis)
+ movingCountCore(threshold, rows, cols, x + , y, vis)
+ movingCountCore(threshold, rows, cols, x, y - , vis)
+ movingCountCore(threshold, rows, cols, x, y + , vis);
}
return count;
}
int getSum(int num)
{
int sum = ;
while (num)
{
sum += num % ;//先取各位
num /= ;//从低到高位
}
return sum;
}
};

剑指offer的更多相关文章

  1. 剑指Offer面试题:1.实现Singleton模式

    说来惭愧,自己在毕业之前就该好好看看<剑指Offer>这本书的,但是各种原因就是没看,也因此错过了很多机会,后悔莫及.但是后悔是没用的,现在趁还有余力,把这本书好好看一遍,并通过C#通通实 ...

  2. 剑指Offer面试题:14.链表的倒数第k个节点

    PS:这是一道出境率极高的题目,记得去年参加校园招聘时我看到了3次,但是每次写的都不完善. 一.题目:链表的倒数第k个节点 题目:输入一个链表,输出该链表中倒数第k个结点.为了符合大多数人的习惯,本题 ...

  3. 《剑指offer》面试题12:打印1到最大的n位数

    面试题12:打印1到最大的n位数 剑指offer题目12,题目如下 输入数字n,按顺序打印出1到最大的n位十进制数,比如输入3,则打印出1,2,3一直到最大的三位数999 方法一 和面试题11< ...

  4. 《剑指offer》面试题11: 数值的整数次方

    面试题11: 数值的整数次方 剑指offer面试题11,题目如下 实现函数double power(double base,int exponent),求base的exponent次方, 不得使用库 ...

  5. 剑指 Offer 题目汇总索引

    剑指 Offer 总目录:(共50道大题) 1. 赋值运算符函数(或应说复制拷贝函数问题) 2. 实现 Singleton 模式 (C#) 3.二维数组中的查找 4.替换空格              ...

  6. 面试题目——《剑指Offer》

    1.把一个字符串转换成整数——<剑指Offer>P29 2.求链表中的倒数第k个结点——<剑指Offer>P30 3.实现Singleton模式——<剑指Offer> ...

  7. 剑指offer习题集2

    1.把数组排成最小的数 class Solution { public: static bool compare(const string& s1, const string& s2) ...

  8. 剑指offer习题集1

    1.打印二叉树 程序很简单,但是其中犯了一个小错误,死活找不到,写代码要注意啊 这里左右子树,要注意是node->left,结果写成root->left vector<int> ...

  9. 剑指Offer:面试题20——顺时针打印矩阵(java实现)

    题目描述: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数 字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1, ...

  10. 牛客网上的剑指offer题目

    题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 题目:请实现一个函数,将一 ...

随机推荐

  1. Sql case when用法

    说明,sql中的if和else 是不能在select 语句中使用的.只能用来控制sql程序的流程.只能用case when. CREATE TABLE USER(NAME VARCHAR(20) NO ...

  2. sqlserver取得本月一号

    select convert(datetime,convert(varchar(7),getdate(),120)+'-01',120) select convert(datetime,convert ...

  3. windows服务异常值framework版本

    sc query WCService | find /i "state"if %errorlevel% == 0 ( net start "WCService" ...

  4. leetcode:Lowest Common Ancestor of a Binary Search Tree

    Given a binary search tree (BST), find the lowest common ancestor (LCA) of two given nodes in the BS ...

  5. spring mvc出现 Failed to convert property value of type 'java.lang.String' to required type 'java.util.Date' for property 'endtime'

    在使用spring mvc中,绑定页面传递时间字符串数据给Date类型是出错: Failed to convert property value of type [java.lang.String] ...

  6. 基于EasyUi的快速开发框架

    先看图,下边这个简单的增.删.改.查,如果自己写代码实现,这两个页需要多少行代码? 如果再有类似的增.删.改.查,又需要多少行代码? 我最近搞的这个快速开发框架中,代码行数不超过100. 两页的代码如 ...

  7. 51nod1161 Partial Sums

    开始想的是O(n2logk)的算法但是显然会tle.看了解题报告然后就打表找起规律来.嘛是组合数嘛.时间复杂度是O(nlogn+n2)的 #include<cstdio> #include ...

  8. Eclipse使用代码清理功能(Clean Up)

    本文转载自http://www.ibm.com/developerworks/cn/opensource/os-eclipse-clean/ 但是为了适应自己使用,还是自己总结了一下. 一.概述 代码 ...

  9. 介绍 Android 的 Camera 框架

    总体介绍 Android Camera 框架从整体上看是一个 client/service 的架构,有两个进程:一个是 client 进 程,可以看成是 AP 端,主要包括 JAVA 代码与一些 na ...

  10. Linux下安装Android Studio(ubuntu)

    一. 安装Android Studio 1. 添加源,按回车键继续 sudo apt-add-repository ppa:paolorotolo/android-studio 2. 更新源 sudo ...