今天完成了剑指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. JSP相对路径与绝对路径探秘

    浏览器端 带杠的 一开始浏览器的地址http://localhost:8080/example/index.jsp 如果写成 <a href="/servlet/TestDBSvl&q ...

  2. 用状态矩阵解决有序操作的case爆炸问题(转载)

    转自http://qa.baidu.com/blog/?p=167 作者:qabloger 一. 简介 我们在测试中可能都会面对case爆炸问题.有的case组合是无序的,我们可以通过pict[1]组 ...

  3. 对Java不能多继承,只能单继承,却可以实现多个接口的理解

    1.java与C++的不同点在于多继承. Java:不能多继承,只能单继承,但可以实现多个接口 C++:可以实现多继承.例如: class A extends B implements C,D,E { ...

  4. 【HDOJ】5446 Unknown Treasure

    1. 题目描述题目很简单,就是求$C(n,m) % M$. 2. 基本思路这是一道应用了众多初等数论定理的题目,因为数据范围较大因此使用Lucas求$C(n,m) % P$.而M较大,因此通过$a[i ...

  5. java操作office和pdf文件页面列表导出cvs,excel、pdf报表.

    在平常的开发中我们常常遇到不仅仅只是导出excel报表的情况.有时候也需要导出pdf或者CSV报 表.其实原理都差不多.刚开始本来不打算也这篇博客介绍这个的.感觉这篇博客和前面的博客有点雷同.原理基本 ...

  6. 《OD学hadoop》第三周0709

    一.MapReduce编程模型1. 中心思想: 分而治之2. map(映射)3. 分布式计算模型,处理海量数据4. 一个简单的MR程序需要制定map().reduce().input.output5. ...

  7. number-of-boomerangs

    https://leetcode.com/problems/number-of-boomerangs/ package com.company; import java.util.*; class S ...

  8. BZOJ 1452 Count

    长知识啦..二维BIT. #include<iostream> #include<cstdio> #include<cstring> #include<alg ...

  9. mac下编译optool方法

    参考地址:http://www.mopsled.com/2016/build-optool-osx/ 1.git clone https://github.com/alexzielenski/opto ...

  10. (六)6.13 Neurons Networks Implements of stack autoencoder

    对于加深网络层数带来的问题,(gradient diffuse  局部最优等)可以使用逐层预训练(pre-training)的方法来避免 Stack-Autoencoder是一种逐层贪婪(Greedy ...