Web前端最全DFS搜索基础题,前端开发面试介绍

总结

我在成长过程中也是一路摸爬滚打,没有任何人的指点,所以走的很艰难。例如在大三的时候,如果有个学长可以阶段性的指点一二,如果有已经工作的师兄可以告诉我工作上需要什么,我应该前面的三年可以缩短一半;后来去面试bat,失败了有5、6次,每次也不知道具体是什么原因,都是靠面试回忆去猜测可能是哪方面的问题,回来学习和完善,当你真正去招人的时候,你就会知道面试记录是多么重要,面试官可以从面试记录里看到你的成长,总是去面试,总是没有成长,就会被定义为缺乏潜力。

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

image
image

1 6 7 4 3 8 5 2

Case 3:

No Answer

分析:这个题难度便比上一个题难度加大了不少,但是有一个易发现的规律:如果想相邻两个数和为素数,那么素数

环中必定是奇偶相隔,所以如果n是奇数,必定有两个奇数相邻的问题,如此便输出“No Answer”。当n==1时算作自

环,输出1。这个问题便简化了一大半了。

简化2;设立一个素数数组,把下标当数字,之后存储他是否是素数,0为素数,1为不是素数。

int prime[40]={1,1,0,0,1,0,1,0,1,1,1,0,1,0,1,1,1,0,1,0,1,1,1,0,1,1,1,1,1,0,1,0,1,1,01,1,1,0,1,1};

简化3:依旧是设立一个visit[]数组,判断遍历与否。

代码如下:

#include

#include

int prime[40]={1,1,0,0,1,0,1,0,1,1,1,0,1,0,1,1,1,0,1,0,1,1,1,0,1,1,1,1,1,0,1,0,1,1,01,1,1,0,1,1};

int visit[21],ring[21];//ring[]存储环上的数字

void DFS(int k,int n)

{

int i;

if (k==n+1&&!prime[ring[1]+ring[n]])//递归边界

{

printf(“1”);//1每次都作为开头输出

for (i=2;i<=n;i++)

printf(" %d",ring[i]);

printf(“\n”);

return;

}

for (i=2;i<=n;i++)

{

if (!visit[i]&&!prime[i+ring[k-1]])//回溯加递归

{

visit[i]=1;

ring[k]=i;

DFS(k+1,n);

visit[i]=0;

}

}

}

int main()

{

int T,n;

T=1;

while(scanf(“%d”,&n),n)

{

printf(“Case %d:\n”,T++);

if(n==1)

{

printf(“1\n”);//特殊情况1

continue;

}

if(n&1)

{

printf(“No Answer\n”);//奇数

continue;

}

memset(visit,0,sizeof(visit));

visit[1]=ring[1]=1;

DFS(2,n);

}

return 0;

}

3、油田,八连快问题(来源http://poj.org/problem?id=1562)

Description

The GeoSurvComp geologic survey company is responsible for detecting underground oil deposits.

GeoSurvComp works with one large rectangular region of land at a time, and creates a grid that divides

the land into numerous square plots. It then analyzes each plot separately, using sensing equipment to

determine whether or not the plot contains oil. A plot containing oil is called a pocket. If two

pockets are adjacent, then they are part of the same oil deposit. Oil deposits can be quite large and

may contain numerous pockets. Your job is to determine how many different oil deposits are contained

in a grid.

Input

The input contains one or more grids. Each grid begins with a line containing m and n, the number of

rows and columns in the grid, separated by a single space. If m = 0 it signals the end of the input;

otherwise 1 <= m <= 100 and 1 <= n <= 100. Following this are m lines of n characters each (not

counting the end-of-line characters). Each character corresponds to one plot, and is either `*',

representing the absence of oil, or `@', representing an oil pocket.

Output

are adjacent horizontally, vertically, or diagonally. An oil deposit will not contain more than 100

pockets.

Sample Input

1 1

*

3 5

*@*@*

**@**

*@*@*

1 8

@@****@*

5 5

****@

*@@*@

*@**@

@@@*@

@@**@

0 0

Sample Output

0

1

2

2

分析:这个题也是DFS里的基础题,亦是设定一个visit[]数组,判断遍历与否。每次访问它便给他一个连通编号,最

后输出连通编号即可。

代码如下:

#include

#include

using namespace std;

const int maxn=1000;

int m,n,idx[maxn][maxn];

char pic[maxn][maxn];

void dfs(int r,int c,int id)

{

if (r<0||r>=m||c<0||c>=n) return;

if (idx[r][c]>0||pic[r][c]!=‘@’) return;

int dr,dc;

idx[r][c]=id;

for (dr=-1;dr<=1;dr++)

for (dc=-1;dc<=1;dc++)

if (dc!=0||dr!=0) dfs(r+dr,c+dc,id);

}

int main()

{

int i,j;

while (scanf(“%d%d”,&m,&n)==2&&m&&n)

{

int count=0;

for (i=0;i<m;i++) scanf(“%s”,pic[i]);

memset(idx,0,sizeof(idx));

for (i=0;i<m;i++)

for (j=0;j<n;j++)

if (idx[i][j]0&&pic[i][j]‘@’) dfs(i,j,++count);

printf(“%d\n”,count);

}

return 0;

}

4、细胞问题(来源http://acm.qust.edu.cn/problem.php?id=1230)

一矩形阵列由数字0到9组成,数字1到9为细胞数字,若沿细胞数字上下左右还是细胞数字则为同一细胞,求给定矩形

阵列的细胞个数。

例如,

0234500067

1034560500

2045600671

0000000089,有4个细胞(细胞为加粗体区域)

输入

第一行是一个测试数据的个数T,表示将会有T组测试数据。

每组测试数据的第一行:两个数字M N (1<=M<=50 1<=N<80)表示该阵列有M行N列。

从第2行到第M+1行每行有连续的N个字符。

输出

与测试数据对应,刚好有T行,每行输出对应测试数据的细胞个数。

样例输入

1

4  10

0234500067

1034560500

2045600671

0000000089

样例输出

4

分析:此题与上一个题可以说是完全相似,只是每个位置的遍历方向减少了四个,只有上下左右,不多做赘述,直接

上代码。

代码如下:

#include

#include

int visit[51][81],m,n;

char a[51][81];

void dfs(int r,int c,int id)

{

if (r<0||c<0||r>=m||c>=n) return;

if (visit[r][c]>0||a[r][c]==‘0’)return;

visit[r][c]=id;

dfs(r+1,c,id);dfs(r-1,c,id);

dfs(r,c+1,id);dfs(r,c-1,id);

}

int main()

{

int cases,i,j;

scanf(“%d”,&cases);

getchar();

while (cases–)

{

int ans=0;

scanf(“%d%d”,&m,&n);

getchar();

memset(visit,0,sizeof(visit));

for (i=0;i<m;i++)

scanf(“%s”,a[i]);

for (i=0;i<m;i++)

for (j=0;j<n;j++)

{

if (visit[i][j]==0&&a[i][j]!=‘0’) dfs(i,j,++ans);

}

printf(“%d\n”,ans);

}

return 0;

}

5、拯救OIBH总部(来源于http://acm.qust.edu.cn/problem.php?id=1101)

OIBH被突来的洪水淹没了> .< 还好OIBH总部有在某些重要的地方起一些围墙,用*号表示,而一个封闭的*号区域洪

水是进不去的……现在给出OIBH的围墙建设图,问OIBH总部没被淹到的重要区域(由" 0" 表示)有多少。

输入

第一行是两个数,x和y(x,y< =500) 第二行及以下是一个由*和0组成的x*y的图。

输出

输出没被水淹没的OIBH总部的“0”的数量。

样例输入

5 4

00000

00*00

0*0*0

00*00

样例输出

1

分析:其实与上面的两个题还是类似的,但是此题有一个特别的地方,模仿洪水从四个方向朝里面涌入(和种子填充类似),最后判定那

几个’0‘没被遍历过,便是所求。

代码如下:

#include

#include

#define maxn 1000

int a[maxn][maxn],visit[maxn][maxn]={0},m,n;

void DFS(int i,int j)

{

if (a[i][j]==0||visit[i][j]==1)

return;

visit[i][j]=1;

DFS(i-1,j);DFS(i+1,j);

DFS(i,j-1);DFS(i,j+1);

}

int main()

{

int m,n,i,j;

char ch;

scanf(“%d%d”,&m,&n);

getchar();

for (i=1;i<=m;i++)

{

总结

秋招即将开始,校招的朋友普遍是缺少项目经历的,所以底层逻辑,基础知识要掌握好!

而一般的社招,更是神仙打架。特别强调,项目经历不可忽视;几乎简历上提到的项目都会被刨根问底,所以项目应用的技术要熟练,底层原理必须清楚。

这里给大家提供一份汇集各大厂面试高频核心考点前端学习资料。涵盖 HTML,CSS,JavaScript,HTTP,TCP协议,浏览器,Vue框架,算法等高频考点238道(含答案)

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

资料截图 :

高级前端工程师必备资料包

招即将开始,校招的朋友普遍是缺少项目经历的,所以底层逻辑,基础知识要掌握好!

而一般的社招,更是神仙打架。特别强调,项目经历不可忽视;几乎简历上提到的项目都会被刨根问底,所以项目应用的技术要熟练,底层原理必须清楚。

这里给大家提供一份汇集各大厂面试高频核心考点前端学习资料。涵盖 HTML,CSS,JavaScript,HTTP,TCP协议,浏览器,Vue框架,算法等高频考点238道(含答案)

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

资料截图 :

高级前端工程师必备资料包

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值